2012-11-16 32 views
1

愚蠢的问题,但我找不到这个问题的正确搜索,我有一个思维障碍。我有一个参考表中的键的表,我想避免使用循环来选择没有重复的记录。我需要加入模式1-5,这样我就可以得到没有重复的名字。请留下意见,以便我澄清。如何使用同一个表中的多个外键连接表?

模式(1-5)是ModeIDs

例子:

表加入

ID 
Mode1 
Mode2 
Mode3 
Mode4 
Mode5 

参考表

ModeID 
ModeName 
+1

请考虑包括示例输入和输出。 –

+0

为什么你的数据库是这样设计的,而不是使用连接表? – Shmiddty

+0

不要问,主管强迫我这样做。我们没有时间修改它。我最初有这样的设计。 – xivo

回答

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

显然用他们实际上填写的表名填写。 – Shmiddty

+0

这是完美的。是的,我知道Join表是正确的。这是我最初的设计,但我的经理/主管不赞成这个......所以我放弃了它,并做出了他们想要的。我试过了。再次感谢! – xivo

+1

嘿,至少你有这个有趣的项目,期待:“通过Mode10添加Mode5” –

1

我认为在视图中取消转换表格将有助于克服许多选择查询的长期表格设计。 (特别是当有人将有天才的想法ADDD第六模式:-)

CREATE VIEW UnpivotedTable AS 
    SELECT 
     ID, Mode, ModeId 
    FROM 
     TableToJoin 
    UNPIVOT (ModeId FOR mode IN (Mode1,Mode2,Mode3,Mode4,Mode5)) AS t 
GO 

您的查询随后将成为一个相当“经典” PIVOT查询(但是这不是我真正的答案的地步。在unpivotting视图是)

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 

希望这将有助于长远。对不起,对于迟到的回答

+0

是的,这将有助于我未来的项目。然而,这些模式不会增加,我相信这一点,除非世界同意这种改变(他们是“天”,以防其他人试图添加一些东西到完成的问题),谢谢jbl! – xivo