Оператор SELECT, сравнивающий несколько полей из нескольких таблиц - PullRequest
3 голосов
/ 13 декабря 2011

У меня есть две отдельные таблицы (Таблица A и Таблица B).Таблица A имеет около 15 столбцов, единственными значимыми из которых являются [Имя] и [Фамилия].В таблице B есть еще много столбцов, и опять же, меня волнуют только FirstName и LastName (поля таблицы B не содержат пробелов, как в таблице A).

Они оба в Access и I 'Я пытаюсь написать запрос, который найдет людей из Таблицы 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 ]

1 голос
/ 13 декабря 2011

Попробуйте это:

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 голосов
/ 15 декабря 2011

Предложение: используйте 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» известен как полуразница a.k.a. antijoin .

0 голосов
/ 13 декабря 2011

Попробуйте это:

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 голосов
/ 13 декабря 2011
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

...