愚蠢的问题,但我找不到正确的搜索这个问题,我有一个思维障碍。我有一个包含引用表中的键的表,我想避免使用循环来选择没有重复的记录。我需要加入模式 1-5,这样我才能获得名称而不会重复。请留下评论,以便我澄清。
Mode(1-5) 是 ModeID
例子:
要加入的表
ID
Mode1
Mode2
Mode3
Mode4
Mode5
参考表
ModeID
ModeName
愚蠢的问题,但我找不到正确的搜索这个问题,我有一个思维障碍。我有一个包含引用表中的键的表,我想避免使用循环来选择没有重复的记录。我需要加入模式 1-5,这样我才能获得名称而不会重复。请留下评论,以便我澄清。
Mode(1-5) 是 ModeID
例子:
要加入的表
ID
Mode1
Mode2
Mode3
Mode4
Mode5
参考表
ModeID
ModeName
这是您的问题的答案:
SELECT
m1.ModeName,
m2.ModeName,
m3.ModeName,
m4.ModeName,
m5.ModeName
FROM Modes m
LEFT JOIN Ref m1 on m1.ModeID = m.Mode1
LEFT JOIN Ref m2 on m2.ModeID = m.Mode2
LEFT JOIN Ref m3 on m3.ModeID = m.Mode3
LEFT JOIN Ref m4 on m4.ModeID = m.Mode4
LEFT JOIN Ref m5 on m5.ModeID = m.Mode5
但我建议您的数据库设计存在问题。您应该使用连接表。
我认为,从长远来看,对于许多选择查询而言,在视图中取消透视表将有助于克服表设计。(尤其是当有人有添加第六种模式的天才想法时 :-)
CREATE VIEW UnpivotedTable AS
SELECT
ID, Mode, ModeId
FROM
TableToJoin
UNPIVOT (ModeId FOR mode IN (Mode1,Mode2,Mode3,Mode4,Mode5)) AS t
GO
然后,您的查询将成为一个相当“经典”的 PIVOT 查询(但这并不是我回答的真正重点。不可透视的观点是)
select Id, Mode1, Mode2, Mode3, Mode4, Mode5
from (
select
Id, Mode, ModeName
from
UnpivotedTable
inner join
ReferenceTable
on ReferenceTable.ModeId = UnpivotedTable.ModeId
) as sourcetable
pivot (
max(ModeName)
for Mode in (Mode1, Mode2, Mode3, Mode4, Mode5)
) as pivotTable
希望从长远来看,这将有所帮助。抱歉回复晚了