2015-08-15 81 views
0

是否可以使用SQL(或PL/SQL)動態連接表?動態或條件加入

我有一個表A與多列。下面的每一列都有自己的獨立表格,除了id。

| id | AA | BB | CC | DD | EE | 
|-----|----|----|----|----|----| 
| 123 | 0 | 0 | 1 | 1 | 1 | 
| 456 | 1 | 1 | 0 | 1 | 1 | 
| 789 | 1 | 0 | 1 | 0 | 0 | 
....... 

根據我需要連接表的列的值。

  • 對於ID = 123我想加入CCDDEE表。
  • 對於ID = 456我想加盟AABBDDEE表。
  • 對於ID = 789我想加盟AACC表。
  • 依此類推。
  • 最後將結果合併到一個表中。
  • 另外,表AABBCCDDEE具有相同的一組列。

實施例的數據:

AA

| id | Value | 
|-----|-------| 
| 456 | bbb | 
| 789 | ccc | 

BB

| id | Value | 
|-----|-------| 
| 789 | ccc | 
| 456 | bbb | 

CC

| id | Value | 
|-----|-------| 
| 123 | aaa | 
| 789 | ccc | 

DD

| id | Value | 
|-----|-------| 
| 123 | aaa | 

EE

| id | Value | 
|-----|-------| 
| 123 | aaa | 

期望輸出

| id | Value | 
|-----|-------| 
| 123 | abc | 
| 789 | ccc | 

ID 456不會成爲最終結果的一部分,因爲它在加入時會被過濾掉。

是否有可能在SQL或PL/SQL(首選普通SQL)中這樣做。另外:我想做一個INNER JOIN

+0

您應該使用樣本數據*和*希望的結果編輯您的查詢。 –

+0

你在價值後放了一段時間的原因是什麼?你能發表DDL嗎? –

+0

這是錯字。更新了問題 –

回答

0

通過EE(而這一切UNION編起來的)的要求JOIN表A AA和表或許應該類似於輸出的

WITH 
TableAUnpivot AS (
    SELECT 
    id 
    , tableName 
    -- , value 
    FROM 
    TableA UNPIVOT EXCLUDE NULLS 
     (VALUE FOR(tableName) IN ("AA", "BB", "CC", "DD", "EE") 
    ) 
), 
DataTablesCombined AS (
    SELECT 'AA' tableName, id, value FROM AA UNION ALL 
    SELECT 'BB', id, value FROM BB UNION ALL 
    SELECT 'CC', id, value FROM CC UNION ALL 
    SELECT 'DD', id, value FROM DD UNION ALL 
    SELECT 'EE', id, value FROM EE 
), 
ReadyForJoin AS (
    SELECT 
    id 
    , tableName 
    , value 
    FROM TableAUnpivot 
    JOIN DataTablesCombined 
    USING (tableName, id) 
), 
LookLikeAJoin AS (
    SELECT 
    * 
    FROM ReadyForJoin 
    PIVOT (MIN(value) FOR tableName 
     IN ('AA' AS AA, 'BB' AS BB, 'CC' AS CC, 'DD' AS DD, 'EE' AS EE)) 
) 
SELECT 
    * FROM LookLikeAJoin ORDER BY id 
; 

這對於採樣數據是

| ID |  AA |  BB |  CC |  DD |  EE | 
|-----|--------|--------|--------|--------|--------| 
| 123 | (null) | (null) | aaa | aaa | aaa | 
| 456 | bbb | bbb | (null) | (null) | (null) | 
| 789 | ccc | (null) | ccc | (null) | (null) | 

其中的細胞是從NULL不同,當且僅當:

  • 已被設定在表A,和
  • 被在相應的表AA通過分配值EE

注:對於這個在所有的工作,所有 S IN 表A必須是NULL指明分數。

提供,這進入正確的方向:如何從這裏繼續?

的最直接方法似乎是由

SELECT 
    id, COALESCE(aa, bb, cc, dd, ee) value FROM LookLikeAJoin WHERE id != 456 ORDER BY id 
; 

更換最終SELECT(鑑於中,ABC爲是一個錯字...)

見上述行動:SQL Fiddle

請評論,如果和因爲這需要調整/進一步的細節。

+0

謝謝你這麼多!!你對這個要求很滿意,看起來好像這樣可以正常工作。我會進一步測試這個,並且讓你知道是否有其他需要。 –

1

您加入全部表格並拉出您需要的列。請注意,SQL查詢定義了一組針對所有行都固定的列。所以,「有條件地」加入表格並沒有什麼意義。你要在哪裏使用列?

你的目的,你要left join

select <columns that you want> 
from table t left join 
    students s 
    on . . . left join 
    classes c 
    on . . . left join 
    . . . 

編輯:

您修訂的問題是非常不同,應該是另外一個問題。但是,我認爲這你想要做什麼:

select 
from a join 
    (select 1 as aa, 0 as bb, 0 as cc, 0 as dd, 0 as ee, id, value from aa union all 
     select 0 as aa, 1 as bb, 0 as cc, 0 as dd, 0 as ee, id, value from bb union all 
     select 0 as aa, 0 as bb, 1 as cc, 0 as dd, 0 as ee, id, value from cc union all 
     select 0 as aa, 0 as bb, 0 as cc, 1 as dd, 0 as ee, id, value from dd union all 
     select 0 as aa, 0 as bb, 0 as cc, 0 as dd, 1 as ee, id, value from ee 
    ) o 
    on a.id = o.id and 
     a.aa = o.aa and a.bb = o.bb and a.cc = o.cc and a.dd = o.dd and a.ee = o.ee; 
+0

左側連接不起作用我已更新問題更清楚 –

+0

感謝您的回覆,我會嘗試此操作,但是,帶有1和0的表格是實際表格的小子集實際表格將包含更多的行和組合 –

+0

@ZAKB ......只能回答你所問的問題如果你有不同的問題,你應該將它作爲一個不同的問題來提問。 –