如何从同一个表中连接具有多个外键的表?

时间:2012-11-16 17:10:20

标签: sql sql-server

愚蠢的问题,但我找不到正确的搜索这个问题,我有一个心态障碍。我有一个表与参考表中的键,我想避免使用循环来选择没有重复的记录。我需要将模式1-5加入,这样我就可以获得没有重复的名称。请留下评论,以便澄清。

模式(1-5)是ModeID

示例:

加入表

ID
Mode1
Mode2
Mode3
Mode4
Mode5

参考表

ModeID
ModeName

2 个答案:

答案 0 :(得分:6)

这是你问题的答案:

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

但我建议您的数据库设计存在问题。您应该使用连接表。

答案 1 :(得分:1)

我认为在视图中对表格进行取消操作将有助于克服许多选择查询的长期表格设计。 (特别是当某人有天才的想法添加第六种模式时: - )

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

希望这对长远来说有所帮助。对不起,迟到了