2016-04-28 12 views
-2

Ich muss aus diesen 3 Tabellen Building, RoomMin und RoomMax auswählen und sie in separaten Feldern darstellen.Wählen Sie Zeilen aus 3 Tabellen aus und zeigen Sie sie in 1 Zeile an.

Tabellen

GenericTableDataID Building 
17     B1 
18     B1 
20     B1 

RoomMinDataID RoomMin 
17    200 
20    100 

RoomMaxDataID RoomMax 
17    299 
18    399 

Gewünschtes Ergebnis

GenericTableDataID Building RoomMin RoomMax 
17     B1   200  299 

fehlgeschlagen Versuch:

SELECT GenericTableData.GenericTableDataID, ValueString AS Building, ValueString AS RoomMin, ValueString AS RoomMax 
FROM GenericTableData INNER JOIN 
    GenericTableDataField ON GenericTableData.GenericTableDataID = GenericTableDataField.GenericTableDataID INNER JOIN 
    GenericTableDefinition ON GenericTableData.GenericTableDefinitionID = GenericTableDefinition.GenericTableDefinitionID INNER JOIN 
    GenericTableDefinitionField ON GenericTableDataField.GenericTableDefinitionFieldID = GenericTableDefinitionField.GenericTableDefinitionFieldID AND 
    GenericTableDefinition.GenericTableDefinitionID = GenericTableDefinitionField.GenericTableDefinitionID 
WHERE GenericTableDefinitionField.GenericTableDefinitionFieldID = 13 -- Access Level 
    AND GenericTableData.GenericTableDataID IN ( -- RoomMin 
     SELECT GenericTableData.GenericTableDataID 
     FROM GenericTableData INNER JOIN 
      GenericTableDataField ON GenericTableData.GenericTableDataID = GenericTableDataField.GenericTableDataID INNER JOIN 
      GenericTableDefinition ON GenericTableData.GenericTableDefinitionID = GenericTableDefinition.GenericTableDefinitionID INNER JOIN 
      GenericTableDefinitionField ON GenericTableDataField.GenericTableDefinitionFieldID = GenericTableDefinitionField.GenericTableDefinitionFieldID AND 
      GenericTableDefinition.GenericTableDefinitionID = GenericTableDefinitionField.GenericTableDefinitionID 
     WHERE ValueInteger <= '235' 
      AND GenericTableData.GenericTableDataID IN (-- List of data that are associated with B1 
       SELECT GenericTableData.GenericTableDataID 
       FROM GenericTableData INNER JOIN 
        GenericTableDataField ON GenericTableData.GenericTableDataID = GenericTableDataField.GenericTableDataID INNER JOIN 
        GenericTableDefinition ON GenericTableData.GenericTableDefinitionID = GenericTableDefinition.GenericTableDefinitionID INNER JOIN 
        GenericTableDefinitionField ON GenericTableDataField.GenericTableDefinitionFieldID = GenericTableDefinitionField.GenericTableDefinitionFieldID AND 
        GenericTableDefinition.GenericTableDefinitionID = GenericTableDefinitionField.GenericTableDefinitionID 
       WHERE ValueString LIKE 'B1' 
      ) 
      AND GenericTableDefinitionField.GenericTableDefinitionFieldID = 11   
    ) 
    AND GenericTableData.GenericTableDataID IN ( -- RoomMax 
     SELECT GenericTableData.GenericTableDataID 
     FROM GenericTableData INNER JOIN 
      GenericTableDataField ON GenericTableData.GenericTableDataID = GenericTableDataField.GenericTableDataID INNER JOIN 
      GenericTableDefinition ON GenericTableData.GenericTableDefinitionID = GenericTableDefinition.GenericTableDefinitionID INNER JOIN 
      GenericTableDefinitionField ON GenericTableDataField.GenericTableDefinitionFieldID = GenericTableDefinitionField.GenericTableDefinitionFieldID AND 
      GenericTableDefinition.GenericTableDefinitionID = GenericTableDefinitionField.GenericTableDefinitionID 
     WHERE ValueInteger >= '235' 
      AND GenericTableData.GenericTableDataID IN (-- List of data that are associated with B1 
       SELECT GenericTableData.GenericTableDataID 
       FROM GenericTableData INNER JOIN 
        GenericTableDataField ON GenericTableData.GenericTableDataID = GenericTableDataField.GenericTableDataID INNER JOIN 
        GenericTableDefinition ON GenericTableData.GenericTableDefinitionID = GenericTableDefinition.GenericTableDefinitionID INNER JOIN 
        GenericTableDefinitionField ON GenericTableDataField.GenericTableDefinitionFieldID = GenericTableDefinitionField.GenericTableDefinitionFieldID AND 
        GenericTableDefinition.GenericTableDefinitionID = GenericTableDefinitionField.GenericTableDefinitionID 
       WHERE ValueString LIKE 'B1' 
      ) 
      AND GenericTableDefinitionField.GenericTableDefinitionFieldID = 12 
    ) 

Meine obige Abfrage zurückgeben keine Zeilen, weil ich für einen bestimmten suchen bin versucht, Gebäuderaumnummer im inneren WO AUSWÄHLT.

+1

Und welche Abfrage haben Sie versucht? Von Ihnen wird erwartet, dass Sie nicht nur erwarten, dass die Codegenerierung als Service dient. –

+0

Ich habe meinen Versuch jetzt hinzugefügt. Tut mir leid, dass ich es nicht früher gezeigt habe. Ich wurde zu der Überzeugung geführt, dass ich versuchen sollte, aus dieser SO-Frage heraus zu koaleszieren und zu drehen: http://stackoverflow.com/questions/5014656/query-to-merge-multiple-rows-into-into-disttinct-rows-with-multiple -Säulen. Vielen Dank an alle, die geantwortet haben. Ich habe jetzt eine gute Richtung. Ich bin es nicht gewohnt, auf diese Weise von mehreren Tischen zu greifen. Ich werde alle deine Vorschläge versuchen und eins als die beste Antwort markieren. –

Antwort

0
SELECT A.GenericTableDataID, A.Building, B.RoomMin, C.RoomMax 
FROM table_1 AS A 
JOIN table_2 AS B ON 
    A.GenericTableID = B.RoomMinDataID 
JOIN table_3 AS C ON 
    A.GenericTableID = C.RoomMaxDataID 
WHERE A.GenericTableID = 17 

table_1 ist die Top-Tabelle in Ihrer Frage, ist table_2 die Mitte und table_3 ist der Boden.

+1

Ich wählte diese Antwort, weil es das ID-Feld in den Filterkriterien hat. Obwohl ich nicht direkt gesagt habe, dass ich danach gesucht habe. Alle anderen Antworten waren hilfreich und führten mich auf den richtigen Weg. –

-1

hier:

select 
    gt.GenericTableDataID, 
    gt.Building, 
    rmn.RoomMin, 
    rmx.RoomMax 
from 
    GenericTable gt, 
    Roommin rmn, 
    Roommax rmx 
where 
    gt.GenericTableDataID = rmn.RoomMinDataID 
    and gt.GenericTableDataID = rmx.RoomMaxDataID 
0

Try this:

SELECT generic.GenericTableId 
    , Building 
    , RoomMin 
    , RoomMax 
FROM GenericTableDataId generic 
    JOIN RoomMinDataId min_data ON generic.GenericTableDataId = min_data.RoomMinDataId 
    JOIN RoomMaxDataId max_data ON generic.GenericTableDataId = max_data.RoomMaxDataId 
0

als fellow "gr1zzly BE4R" post, Sie Funktionen JOIN und verwenden Sie ein paar alias

SELECT GenericTableDataID,Building,RoomMin,RoomMax 
From table1 
join table2 on 
    GenericTableDataID=RoomMinDataID 
join table3 on 
    RoomMinDataID=RoomMaxDataID 
where GenericTableDataID = 17 

auch

select GenericTableDataID,Building,RoomMin,RoomMax 
FROM table1,table2,table3 
where GenericTableDataID=RoomMinDataID and RoomMinDataID=RoomMaxDataID and GenericTableDataID=17 
0

meine letzte Abfrage, eine weitere Option könnte hier:

SELECT DISTINCT Data.GenericTableDataID AS AccessLevelID, TDRR.Building, TDRR.RoomMin, LTDRR.RoomMax, DataF.ValueString AS AccessLevel 
FROM GenericTableData Data 
    INNER JOIN GenericTableDataField DataF ON Data.GenericTableDataID = DataF.GenericTableDataID 
    INNER JOIN GenericTableDefinition Def ON Data.GenericTableDefinitionID = Def.GenericTableDefinitionID 
    INNER JOIN GenericTableDefinitionField DefF ON DataF.GenericTableDefinitionFieldID = DefF.GenericTableDefinitionFieldID AND 
     Def.GenericTableDefinitionID = DefF.GenericTableDefinitionID 
    INNER JOIN TableDataRoomRanges TDRR ON TDRR.BuildingDataID = Data.GenericTableDataID 
WHERE DefF.GenericTableDefinitionFieldID = 13 

-- Query for TableDataRoomRanges view 
SELECT TableDataBuildings.BuildingDataID, TableDataBuildings.Building, TableDataRoomMin.RoomMin, TableDataRoomMax.RoomMax 
FROM 
    TableDataBuildings 
INNER JOIN 
    TableDataRoomMin ON TableDataBuildings.BuildingDataID = TableDataRoomMin.RoomMinDataID 
INNER JOIN 
    TableDataRoomMax ON TableDataBuildings.BuildingDataID = TableDataRoomMax.RoomMaxDataID 
+0

Was passiert, wenn Sie distinct nicht verwenden? –

+0

Wenn ich distinct nicht verwende, könnte ich doppelte Zeilen erhalten. –

+0

wirklich? Ich hätte es nie erraten. Der Punkt meiner Frage ist, dass "select distinct" oft keine gute Lösung ist, wenn es über mehrere Joins verwendet wird und dass Sie möglicherweise eine oder mehrere dieser Tabellen mit einer Unterabfrage behandeln müssen, so dass Sie sie nicht verwenden müssen. http://weblogs.sqlteam.com/markc/archive/2008/11/11/60752.aspx –

Verwandte Themen