2015-08-15 37 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 ......只能回答你所问的问题如果你有不同的问题,你应该将它作为一个不同的问题来提问。 –