2011-12-26 83 views
2

我有14个描述分层XML数据结构的表。一个字段是该行的关键字,另一个字段是其父项的外键。其余60个字段在每个表中都是相同的。SQL左外连接 - 与行相同的已命名字段而不是列

我想得到一个大的连续行列表,而不是水平添加列。

例如,以下设置为给我6列。我如何将它序列化为3列和更多行?

SELECT ICN2.ICNID, ICN2.ICNTITLE, ICN2.PANE, ICN3.ICNID AS ICNID2, 
    ICN3.ICNTITLE AS ICNTITLE2, ICN3.PANE AS PANE2 
FROM ICN2 
LEFT OUTER JOIN ICN3 ON ICN2.ICN2_PKEY = ICN3.ICN2_FKEY 
WHERE ICN2.ICNID = N'65587' 

回答

1

使用SQL UNION以创建单个(化名)的结果集,然后应用条件:

SELECT * FROM (
    SELECT ICNID, ICNTITLE, PANE 
    FROM ICN2 
    UNION ALL 
    SELECT ICNID, ICNTITLE, PANE 
    FROM ICN3 
    UNION ALL 
    SELECT ICNID, ICNTITLE, PANE 
    FROM ICN4 
    ...) A 
WHERE ICNID = N'65587' 

这是MySQL和postgres的语法中,但确切的语法可能取决于你正在使用哪个数据库。

如果您需要知道哪些行的来源,添加一个常数的每一行:

SELECT * FROM (
    SELECT 'ICN2' as SOURCE, ICNID, ICNTITLE, PANE 
    FROM ICN2 
    UNION ALL 
    SELECT 'ICN3', ICNID, ICNTITLE, PANE 
    FROM ICN3 
    UNION ALL 
    ...) A 
WHERE ICNID = N'65587' 

BTW UNION ALL保留排序和重复行。 Plain UNION排序并删除重复的行。之所以选择这曾经最适合您

+0

谢谢 - 我正在寻找如何全联盟应用到右外嵌套加入SELECT * ICN3,ICN2 * FROM RIGHT ICN3 OUTER JOIN ICN2 ON ICN3.ICN2_FKEY = ICN2。 ICN2_PKEY WHERE(ICN2.ICNID = N'65587' – phoenixAZ 2011-12-26 23:25:06

+0

查看修改后的答案,只使用了一个WHERE子句 – Bohemian 2011-12-27 19:17:25

+0

我认为我不是特定的,因为我有一个左连接的连锁分支,我无法构造一个SQL查询,但我能够创建一个将使用Visual Basic深入研究的递归循环。 – phoenixAZ 2011-12-27 21:42:37