Как выбрать идентификатор, когда у нас нет совпадающих записей в Teradata - PullRequest
0 голосов
/ 06 февраля 2019

Скажем, у меня есть две таблицы, как показано ниже:

+-------------------------+   +-------------------------+
| Person                  |   | Person Details          |
+----------+--------------+   +-------------------------+
| Name     |VARCHAR(255)  |   | SK       | Decimal(18,0)|
| PersonID | INT(11)      |   | PersonID | INT(11)      |
+----------+--------------+   | Name     | VARCHAR(255) |
                              |                         |
                              +----------+--------------+

Мои таблицы содержат следующие данные:

+------------------------+    +---------------------------+
| Person                 |    | Person Details            |
+----------+-------------+    +-------+----------+--------+
| Name     | PersonID    |    | SK    | PersonID | Name   |
+----------+-------------+    +-------+----------+--------+
| Sean     | 1           |    | 1     | 1        | Sean   |
| Javier   | 1           |    | 2     | 1        | Cooper |
| Fluffy   | 2           |    | 3     | 2        | Trade  |
+----------+-------------+    +-------+----------+--------+

Мне нужно выбрать PersonId из таблицы Person, где все имя связано с Idне должно быть в таблице «Сведения о человеке».В приведенном выше примере мой запрос должен возвращать только 2, а не PersonID 1, так как «Sean» находится в таблице Person и Person_details.Я пробовал ниже запрос и не работал:

sel P.PersonID
from Person P
left join Person_details PD
on PD.PersonId = P.PersonId
and PD.Name = P.Name

where PD.PersonId is NULL

Может кто-нибудь, пожалуйста, помогите.

Заранее спасибо.

1 Ответ

0 голосов
/ 06 февраля 2019

Ваш текущий запрос возвращает все идентификаторы PersonID, для которых любое имя отсутствует.

Чтобы получить те идентификаторы, в которых отсутствуют все имена, вам нужно объединить:

SELECT P.PersonID
FROM Person P
LEFT JOIN Person_details PD
  ON PD.PersonId = P.PersonId
 AND PD.Name = P.Name
GROUP BY p.PersonID             -- for each PersonID
HAVING Max(pd.PersonID) IS NULL -- no match was found
...