1

愚蠢的问题,但我找不到正确的搜索这个问题,我有一个思维障碍。我有一个包含引用表中的键的表,我想避免使用循环来选择没有重复的记录。我需要加入模式 1-5,这样我才能获得名称而不会重复。请留下评论,以便我澄清。

Mode(1-5) 是 ModeID

例子:

要加入的表

ID
Mode1
Mode2
Mode3
Mode4
Mode5

参考表

ModeID
ModeName
4

2 回答 2

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

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

于 2012-11-16T17:14:39.213 回答
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

希望从长远来看,这将有所帮助。抱歉回复晚了

于 2012-11-19T09:27:44.550 回答