Для таблицы A верните все значения в столбце X таблицы B - PullRequest
0 голосов
/ 21 января 2020

У меня есть две таблицы, одна таблица имен сотрудников, 176 записей. Другая - это таблица (с дубликатами) имен сотрудников (того же формата) и их местоположения (7943 строки).

С этот ответ я пришел к выводу, что мне нужно левое соединение, чтобы дать мне только строки из таблицы A.

Я надеялся, что приведенное ниже вернет мне исходные 176 строк из таблицы A, каждый столбец со значением для местоположения из таблицы B, в противном случае пустым, если он недоступен, однако он дает мне 7601 строк, которые я не могу понять на всю жизнь:

SELECT e.[UniqueName], l.[location]
FROM [Employees] as e

left join Locations as l
on e.[UniqueName] = l.[UniqueName]

Даже используя группу по (что я не уверен, почему это было бы необходимо, учитывая, что я спрашиваю только то, что в Таблице A) дает 172 строки, хотя каждое имя в таблице «Сотрудники» уникально!

Ответы [ 3 ]

1 голос
/ 21 января 2020

Таблица Locations содержит более 1 местоположения для каждого сотрудника, и поэтому вы получаете так много строк в результатах. Если вам нужно только 1 местоположение, и не имеет значения, какое 1, добавьте агрегацию к вашему запросу:

SELECT e.[UniqueName], MAX(l.[location]) AS location
FROM [Employees] as e
LEFT JOIN Locations as l
ON e.[UniqueName] = l.[UniqueName]
GROUP BY e.[UniqueName]

Вы можете использовать MIN() вместо MAX().

1 голос
/ 21 января 2020

Я надеялся, что приведенное ниже вернет мне исходные 176 строк из таблицы A, каждый столбец со значением для местоположения из таблицы B, в противном случае пустым, если он недоступен, однако он дает мне 7601 строк, которые я не могу для жизнь меня понимает ...

В то время как left join всегда будет возвращать все записей из набора данных в левой части объединения, количество записей, возвращаемых запрос будет зависеть от количества возможных пар между двумя наборами данных, которое (для left join) всегда будет больше или равно количеству записей в наборе данных слева от объединения.

В качестве примера рассмотрим следующие два набора данных:

Сотрудники

+------------+
| UniqueName |
+------------+
| Alice      |
| Bob        |
| Charlie    |
+------------+

Местоположения

+------------+----------+
| UniqueName | Location |
+------------+----------+
| Alice      | London   |
| Bob        | Berlin   |
| Bob        | New York |
| Bob        | Paris    |
+------------+----------+

Оценка запрос:

select 
    e.[uniquename], l.[location]
from 
    [employees] as e left join locations as l 
    on e.[uniquename] = l.[uniquename]

приведет к тому, что записи будут спарены следующим образом:

enter image description here

и, следовательно, вернутся результат:

+------------+----------+
| uniquename | location |
+------------+----------+
| Alice      | London   |
| Bob        | Berlin   |
| Bob        | New York |
| Bob        | Paris    |
| Charlie    |          |
+------------+----------+
0 голосов
/ 21 января 2020

Вы можете использовать коррелированный подзапрос:

SELECT e.[UniqueName],
       (SELECT TOP 1 l.[location]
        FROM locations as l
        WHERE e.[UniqueName] = l.[UniqueName]
       ) as location
FROM [Employees] as e;

Примечание: ORDER BY отсутствует, поэтому это возвращает произвольное местоположение.

Если location может быть продублировано для заданного UniqueName, вы получите ошибку. Чтобы решить эту проблему, вы можете использовать функции агрегирования:

SELECT e.[UniqueName],
       (SELECT MAX(l.[location])
        FROM locations as l
        WHERE e.[UniqueName] = l.[UniqueName]
       ) as location
FROM [Employees] as e;
...