Sql 从3个表中选择行并显示在1行中

Sql 从3个表中选择行并显示在1行中,sql,tsql,Sql,Tsql,我需要从这3个表中选择Building、RoomMin和RoomMax,并在单独的字段中显示它们 桌子 GenericTableDataID Building 17 B1 18 B1 20 B1 RoomMinDataID RoomMin 17 200 20 100 RoomMaxDataID RoomMax 17

我需要从这3个表中选择Building、RoomMin和RoomMax,并在单独的字段中显示它们

桌子

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
失败的尝试:

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
    )
我上面的查询没有返回任何行,因为我正在尝试在选择的内部区域中搜索特定的建筑房间号。

尝试以下操作:

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

在你的问题中,表1是最上面的表,表2是中间的表,表3是最下面的表。

作为gr1zzly be4r的同事,你可以使用连接函数和一些别名

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
这是我的最后一个问题:

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

你试过什么问题?您需要尝试的不仅仅是将代码生成作为服务。我现在添加了我的尝试。很抱歉,我没有早点看。我被引导去相信我应该试着从这个问题上结合和旋转。谢谢所有回复的人。我现在有一个好的方向去追求。我不习惯用这种方式从多个表中抓取数据。我将尝试您的所有建议,并将其中一个标记为最佳答案。我选择此答案是因为它在筛选条件中具有ID字段。尽管我没有直接说那是我想要的。所有其他的答案都很有帮助,引导我找到了正确的方向。如果你不使用distinct会发生什么?如果我不使用distinct,我可能会得到重复的行。真的吗?我永远也猜不到。我的问题是,当在多个联接上使用select distinct时,它通常不是一个好的解决方案,您可能需要通过子查询处理其中的一个或多个表,以便不需要使用它。
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