3

我必须有两个单独的表(表 A 和表 B)。表 A 有大约 15 列,唯一重要的是 [First Name] 和 [Last Name]。表 B 有更多的列,而我唯一关心的是 FirstName 和 LastName(表 B 的字段不包含空格,而表 A 则包含空格)。

他们都在 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 中的名字 + 姓氏创建别名,但我不知道我该怎么做。

4

4 回答 4

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
于 2011-12-13T16:52:41.350 回答
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 中的所有记录。然后,您可以使用 WHERE 将其过滤到不匹配的记录

于 2011-12-13T16:53:28.613 回答
0

建议:使用VIEWs 从数据元素名称中删除那些烦人的空格,提供一致的命名并连接全名属性,例如

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 查询模式,例如使用 ADO 连接。

ps “表 B 中不在表 A 中的人”的运算符被称为semi Difference aka antijoin

于 2011-12-15T16:24:10.420 回答
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)
于 2011-12-13T16:58:43.710 回答