2011-12-13 95 views
3

我有两个独立的表(表A和表B)。 表A有大约15列,唯一重要的是[名字]和[姓氏]。 表B有更多的列,并且我唯一关心的是FirstName和LastName(表B的字段不包含空格,其中的表A是这样做的)。SELECT语句比较来自多个表的多个字段

他们都在Access中,我正试着编写一个查询,查找表B中不在表A中的人。我非常喜欢SQL,但这里是我想到的:

SELECT ([Table A].[First Name] + [Table B].[Last Name]) AS FullName 
FROM [Table A] 
LEFT JOIN [Table B] 
ON [Table A].FullName=[Table B].([First Name] + [Table B].[Last Name]) AS FullName 
WHERE [Table A].FullName IS NULL; 

它不喜欢我尝试为表B中的名字+姓氏制作别名,但我不知道该如何做。

+0

数据库名称中的空格使我的大脑受伤。 –

+0

通过空格你的意思是他们是完全空白的,或者你的意思是他们之间的字符间空格 – user559142

+0

我认为你的paranthesis是在错误的地方..实际上应该不应该在这个查询中需要任何括号。 –

回答

1

试试这个:

SELECT ([Table A].[First Name] + ' ' + [Table A].[Last Name]) AS FullName 
FROM [Table B] 
LEFT OUTER JOIN [Table A] 
ON [Table A].[First Name]=[Table B].[First Name] AND [Table B].[Last Name] = [Table A].[Last Name] 
WHERE [Table A].[First Name] IS NULL AND [Table A].[Last Name] IS NULL 
0
SELECT ([Table A].[First Name] + [Table B].[Last Name]) AS FullName 
FROM [Table A] 
RIGHT OUTER JOIN [Table B] 
ON [Table A].FullName= ([Table B].([First Name] + [Table B].[Last Name]) 
WHERE [Table A].FullName IS NULL; 

这里的关键是使用外连接时,它会给你从表B中的所有记录,而不管的加入。然后,您可以使用它过滤到非匹配的记录,其中

+0

这会找到表A中不在表B中的人,反之亦然。 – jmacinnes

+0

正确和编辑,我读错了问题。 – Maess

0

试试这个:

SELECT [B].[First Name] & " " & [B].[Last Name] AS FullName 
FROM TableB AS B 
WHERE [B].[First Name] & " " & [B].[Last Name] NOT IN 
(SELECT [First Name] & " " & [Last Name] FROM TableA) 
0

建议:使用VIEW s到要从数据元素名称那些烦人的空间,提供了一个一致的命名和连接全名属性,例如

CREATE VIEW TableA 
AS 
SELECT [First Name] AS first_name, 
     [Last Name] AS last_name, 
     first_name + ' ' + last_name AS full_name 
    FROM [Table A]; 


CREATE VIEW TableB 
AS 
SELECT FirstName AS first_name, 
     LastName AS last_name, 
     first_name + ' ' + last_name AS full_name 
    FROM [Table B]; 

SELECT * 
    FROM TableB AS B 
WHERE NOT EXISTS (
        SELECT * 
        FROM TableA AS A 
        WHERE B.full_name = A.full_name 
       ); 

CREATE VIEW要求ANSI-92 Query Mode例如使用ADO连接。

p.s. “表B中不在表A中的人”的操作员被称为semi difference a.k.a. antijoin

+0

这个查询需要很长时间来处理,我有最新的Phpmyadmin和Navicat,当我执行最后一个时,两者都会卡住。我需要这样的东西,但也许更快?我有50K +记录,我在包含字符串200Characters的列上比较tableA/B。对于这种情况的任何建议?谢谢 – Awena