我有两张表Test_Table
和Test_Table2
。我想要两个中的UNION ALL
或UNION
,但我只想要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执行此操作。我怎样才能获得这些行。
答案 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)
另外,请查看MINUS
和INTERSECT
,它们可以像UNION
一样使用,但要创建一个数据集而不在另一个数据集中匹配记录,或者在这些数据集上创建数据集与其他数据集匹配的记录。请参阅:http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries004.htm
我不认为MINUS
或INTERSECT
会使这个具体案例更容易,但如果您遇到类似的问题,它们可能会有用。
答案 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
,因此您不需要union
。 union all
效率更高,因为它不会添加删除重复项的步骤。