2011-12-26 82 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