愚蠢的问题,但我找不到这个问题的正确搜索,我有一个思维障碍。我有一个参考表中的键的表,我想避免使用循环来选择没有重复的记录。我需要加入模式1-5,这样我就可以得到没有重复的名字。请留下意见,以便我澄清。如何使用同一个表中的多个外键连接表?
模式(1-5)是ModeIDs
例子:
表加入
ID
Mode1
Mode2
Mode3
Mode4
Mode5
参考表
ModeID
ModeName
愚蠢的问题,但我找不到这个问题的正确搜索,我有一个思维障碍。我有一个参考表中的键的表,我想避免使用循环来选择没有重复的记录。我需要加入模式1-5,这样我就可以得到没有重复的名字。请留下意见,以便我澄清。如何使用同一个表中的多个外键连接表?
模式(1-5)是ModeIDs
例子:
表加入
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
但我会建议你的数据库设计有问题。你应该使用连接表。
我认为在视图中取消转换表格将有助于克服许多选择查询的长期表格设计。 (特别是当有人将有天才的想法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
希望这将有助于长远。对不起,对于迟到的回答
是的,这将有助于我未来的项目。然而,这些模式不会增加,我相信这一点,除非世界同意这种改变(他们是“天”,以防其他人试图添加一些东西到完成的问题),谢谢jbl! – xivo
请考虑包括示例输入和输出。 –
为什么你的数据库是这样设计的,而不是使用连接表? – Shmiddty
不要问,主管强迫我这样做。我们没有时间修改它。我最初有这样的设计。 – xivo