0

我有来自不同表的以下数据集

Table1
-------
EMPID    DEPID   C1  C2  SUM
---------------------------
100      200     2    3   111
100      200     4    4   222

 Table2
-------
EMPID    DEPID   C1  C2  SUM
---------------------------
100      200     4    4   333
100      200     5    6   444

我正在寻找的结果---

Table1
-------
EMPID    DEPID   T1.C1  T1.C2  T2.C1   T2.C2    T1.SUM   T2.SUM
--------------------------------------------------------------
100      200       2      3     NULL    NULL     111      NULL
100      200       4      4      4        4      222      333
100      200       NULL   NULL   5        6      NULL     444

任何帮助都非常受欢迎。我使用了完全外连接,但无法做到这一点。

4

1 回答 1

3

你想要一个INNER JOINon(emp_id, dep_id)和一个FULL OUTER JOINon (c1, c2)。我认为您将无法一步编写此连接条件。我提出了一个两步查询(aFULL OUTER JOIN后跟一个过滤子查询)。

SQL> WITH t1 AS (
  2  SELECT 100 emp_id, 200 dep_id, 2 c1, 3 c2, 111 sum FROM dual UNION ALL
  3  SELECT 100 emp_id, 200 dep_id, 4 c1, 4 c2, 222 sum FROM dual
  4  ), t2 AS (
  5  SELECT 100 emp_id, 200 dep_id, 4 c1, 4 c2, 333 sum FROM dual UNION ALL
  6  SELECT 100 emp_id, 200 dep_id, 5 c1, 6 c2, 444 sum FROM dual UNION ALL
  7  SELECT 100 emp_id, 300 dep_id, 7 c1, 8 c2, 555 sum FROM dual
  8  )
  9  SELECT COALESCE(t1.emp_id, t2.emp_id) emp_id,
 10         COALESCE(t1.dep_id, t2.dep_id) dep_id,
 11         t1.c1, t1.c2, t2.c1, t2.c2, t1.sum, t2.sum
 12    FROM t1
 13    FULL OUTER JOIN t2
 14      ON t1.emp_id = t2.emp_id
 15     AND t1.dep_id = t2.dep_id
 16     AND t1.c1 = t2.c1
 17     AND t1.c2 = t2.c2
 18   WHERE (COALESCE(t1.emp_id, t2.emp_id), COALESCE(t1.dep_id, t2.dep_id))
 19         IN (SELECT t1.emp_id, t1.dep_id
 20               FROM t1
 21               JOIN t2 ON t1.emp_id = t2.emp_id
 22                      AND t1.dep_id = t2.dep_id)
 23  ORDER BY t1.c1;

    EMP_ID     DEP_ID         C1         C2         C1         C2  SUM  SUM
---------- ---------- ---------- ---------- ---------- ---------- ---- ----
       100        200          2          3                        111 
       100        200          4          4          4          4  222  333
       100        200                                5          6       444

请注意,我在T2您的示例中添加了一行来演示INNER JOIN.

于 2013-04-04T13:05:53.087 回答