Sql 从3个表中选择行并显示在1行中
我需要从这3个表中选择Building、RoomMin和RoomMax,并在单独的字段中显示它们 桌子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
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