SQL左外连接 - 与行而不是列相同的命名字段

时间:2011-12-26 22:41:02

标签: sql union

我有14个表来描述分层XML数据结构。一个字段是行的键,另一个字段是其父键的外键。其余60个字段在每个表中都相同。

我想获得一个大的行序列列表,而不是水平添加列。

例如,以下设置为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 个答案:

答案 0 :(得分: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保留排序和重复行。普通UNION排序并删除重复的行。选择最适合你的