如何在MS Access中的连续列上SQL JOIN?

时间:2016-02-05 19:26:48

标签: sql ms-access join concatenation matching

我有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,因为我的实际数据集非常大。有人能给我建议吗?

1 个答案:

答案 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
)