我有2个表,其中列X和Y连接起来表示唯一标识符。我想找到tableB中tableA中不存在的所有行,并将它们添加到tableC中。
-------tableA-------- // tableA is a master refernce table with all names so far
|__X__|__Y__|_name__|
| 3 | 7 | Mary |
| 3 | 2 | Jaime |
-------tableB-------- // tableB is an input file with all daily names (some repeats already exist in tableA)
|__X__|__Y__|_name__|
| 2 | 5 | Smith |
| 3 | 7 | Mary |
-------tableC-------- // tableC is a temporary holding table for new names
|__X__|__Y__|_name__|
| | | |
DESIRED RESULT:
-------tableC-------- // tableB - tableA = tableC
|__X__|__Y__|_name__|
| 2 | 5 | Smith |
我想根据连接的X + Y值匹配行。到目前为止,我的SQL查询如下所示:
INSERT INTO tableC
SELECT * FROM tableA
LEFT JOIN tableB
ON tableA.X & table.B = tableB.X & tableB.Y
WHERE tableB.X & tableB.Y IS null
然而,这并没有给我预期的结果。我不能使用EXISTS,因为我的实际数据集非常大。有人能给我建议吗?
答案 0 :(得分:0)
我不认为这种缓慢是由exists
引起的。您的查询可能很慢,因为您尝试使用串联来匹配多个列。请改用and
并确保在(x,y)上有复合索引:
这将选择tableB中不具有tableA中相同(x,y)值的所有唯一行。请注意,任何具有相同x,y但名称不同的行都会显示在结果中(即2,5,Joe也会出现)。如果您不想要,那么您必须按x,y进行分组,并在x,y重复但名称不同的情况下决定您想要的名称。
select distinct x,y,name
from tableB b
where not exists (
select 1 from tableA a
where a.x = b.x
and a.y = b.y
)