2016-04-28 14 views
-2

これらの3つのテーブルからBuilding、RoomMin、RoomMaxを選択し、別々のフィールドに表示する必要があります。私は、特定の検索しようとしているので、私の上記のクエリがローを返さない3つのテーブルから行を選択して1行に表示

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 
    ) 

GenericTableDataID Building 
17     B1 
18     B1 
20     B1 

RoomMinDataID RoomMin 
17    200 
20    100 

RoomMaxDataID RoomMax 
17    299 
18    399 

望ましい結果

GenericTableDataID Building RoomMin RoomMax 
17     B1   200  299 

失敗し

テーブル内部の部屋番号を選択します。ここで

+1

あなたはどんな質問をしましたか?コード生成をサービスとして期待するだけではない。 –

+0

私は今私の試行を追加しました。申し訳ありませんが、私は以前にそれを示していませんでした。私はこのSOの質問から合体とピボットのようなピボットを試みるべきだと私は信じていた:http://stackoverflow.com/questions/5014656/query-to-merge-multiple-rows-into-into-distinct-rows-with-multiple - 列。 お返事いただきありがとうございました。私は今追求する良い方向がある。私はこのように複数のテーブルをつかむことに慣れていない。私はあなたの提案をすべて試し、最高の答えとして1つマークします。 –

答えて

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_1table_2が真ん中で、あなたの質問のトップテーブルであり、table_3は一番下です。

仲間として
+1

フィルタリング基準にIDフィールドがあるので、この回答を選択しました。私はそれが私が探していたものであると直接言わなかったとしても。しかし、他のすべての答えは役に立つと私を正しい道に導く。 –

-1

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

これを試してみてください:

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

ポスト "gr1zzly be4r"、あなたは関数をJOINを使用して、いくつかのエイリアス

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

、別のオプションを使用することができ

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

ここに私の最後のクエリです:

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

別名を使用しないとどうなりますか? –

+0

distinctを使用しないと、重複した行が表示される可能性があります。 –

+0

本当ですか?私は決して推測できませんでした。私の質問のポイントは、 'select distinct'は、複数の結合で使用され、それらを使用する必要がないようにサブクエリでこれらのテーブルを扱う必要がある場合があるということです。 http://weblogs.sqlteam.com/markc/archive/2008/11/11/60752.aspx –

関連する問題