Oracle SQL UNION ALL,其中T1.ID<> T2.ID

时间:2014-08-18 14:31:12

标签: sql oracle union union-all

我有两张表Test_TableTest_Table2。我想要两个中的UNION ALLUNION,但我只想要TEST_TABLE2中我没有ID的TEST_TABLE行。SELECT ID, DATE_VALUE, TEXT_VALUE, TABLESOURCE FROM TEST_TABLE UNION SELECT ID, OTHER_DATE_VALUE AS DATE_VALUE, OTHER_TEXT_VALUE AS TEXT_VALUE, TABLESOURCE FROM TEST_TABLE2; 。 ID可以是两个表中唯一的,也可以存在于两个表中,因为它们是从两个不同的系统填充的。

我一直在运行此声明,然后只是处理重复的ID,但我希望不会有重复的ID。

{{1}}

以下是表格。

http://sqlfiddle.com/#!2/2db484/2

我正在使用 “Oracle Database 11g企业版版本11.2.0.3.0 - 64位生产”

我无法让SQL执行此操作。我怎样才能获得这些行。

2 个答案:

答案 0 :(得分:6)

您可以将Test_Table连接到TestTable2以查找不匹配的行:

SELECT 
  ID, DATE_VALUE, TEXT_VALUE, TABLESOURCE 
FROM TEST_TABLE
UNION -- or UNION ALL, which might be faster
SELECT 
  t2.ID, t2.OTHER_DATE_VALUE AS DATE_VALUE, t2.OTHER_TEXT_VALUE AS TEXT_VALUE, t2.TABLESOURCE 
FROM 
  TEST_TABLE2 t2
  LEFT JOIN TEST_TABLE t on t.ID = t2.ID
WHERE
  t.ID IS NULL

http://sqlfiddle.com/#!2/2db484/6

或者,您可以使用WHERE NOT EXISTS ...仅返回t2中不匹配行的t行:

SELECT 
  ID, DATE_VALUE, TEXT_VALUE, TABLESOURCE 
FROM TEST_TABLE
UNION -- or UNION ALL, which might be faster
SELECT 
  ID, 
  OTHER_DATE_VALUE, -- Note, you don't need the alias in the second query of the union.
  OTHER_TEXT_VALUE AS TEXT_VALUE, -- Although you can leave it as 'self-documentation'.
  TABLESOURCE 
FROM 
  TEST_TABLE2 t2
WHERE
  NOT EXISTS 
    (SELECT 'x' FROM TEST_TABLE t WHERE t.ID = t2.ID)

另外,请查看MINUSINTERSECT,它们可以像UNION一样使用,但要创建一个数据集而不在另一个数据集中匹配记录,或者在这些数据集上创建数据集与其他数据集匹配的记录。请参阅:http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries004.htm

我不认为MINUSINTERSECT会使这个具体案例更容易,但如果您遇到类似的问题,它们可能会有用。

答案 1 :(得分:2)

我会把它写成:

SELECT ID, DATE_VALUE, TEXT_VALUE, TABLESOURCE
FROM TEST_TABLE
UNION ALL
SELECT ID, OTHER_DATE_VALUE AS DATE_VALUE, OTHER_TEXT_VALUE AS TEXT_VALUE, TABLESOURCE
FROM TEST_TABLE2 T2
WHERE NOT EXISTS (SELECT 1 FROM TEST_TABLE T WHERE T.ID = T2.ID);

由于您选择了不同的id,因此您不需要unionunion all效率更高,因为它不会添加删除重复项的步骤。