естественное соединение и оператор минус - PullRequest
0 голосов
/ 01 февраля 2019

Question and expected output

ERD

Привет! Я пытаюсь выяснить вопрос ниже.

Это сезон RRSP, и банк стремится продвигать свои RRSP.Составьте список всех клиентов, у которых есть хотя бы один тип учетной записи, но у которых в настоящее время нет учетной записи RRSP.Опять же, НЕ используйте жестко закодированные коды account_type, вместо этого используйте описания учетной записи.Решите, используя естественное соединение.

Я почти уверен, что мне нужно использовать оператор MINUS для решения вопроса.Это то, что я до сих пор.Я приложил ожидаемый результат для вопроса.

SELECT surname "Last", 
       first_name "First" 
FROM wgb_customer wc 
NATURAL JOIN wgb_account wa 
NATURAL JOIN wgb_account_type wat 
MINUS 
SELECT surname, 
       first_name 
FROM wgb_account_type wat 
NATURAL JOIN wgb_account wa 
NATURAL JOIN wgb_customer wc 
ORDER BY 1;

Тем не менее, он говорит, что строки не выбраны.Пожалуйста, помогите!

Ответы [ 4 ]

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

Вам просто не хватает условия поиска для учетных записей RRSP, например

SELECT surname, 
       first_name 
FROM wgb_customer 
NATURAL JOIN wgb_account 
MINUS 
SELECT surname, 
       first_name 
FROM wgb_account_type 
NATURAL JOIN wgb_account 
NATURAL JOIN wgb_customer
WHERE Account_description = 'RRSP'
0 голосов
/ 01 февраля 2019

Если я правильно читаю этот вопрос, значит, вы используете неправильный вид естественного объединения, и вам следует обратить внимание на использование внешнего естественного соединения. Это также означает, что вам не понадобится ключевое слово минус.

Выможете перейти по этой ссылке для получения дополнительной информации об объединениях.

Единственная строка, которую я хочу отметить из этой документации, - это то, что естественное объединение будет рассматриваться как "ВНУТРЕННЕЕ".Это означает, что ключ, который проверяют ваши общие столбцы, должен присутствовать в обеих таблицах.то, что вы хотите, это то, что существует только в одной таблице, следовательно, Внешнее соединение.Удачи!

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

Я бы предложил exists и not exists:

SELECT wc.*
FROM wgb_customer wc 
WHERE EXISTS (SELECT 1
              FROM wgb_account wa JOIN
                   wgb_account_type wat 
                   ON wat.account_type = wa.account_type
              WHERE wat.account_type <> 'RRSP'
             ) AND
      NOT EXISTS (SELECT 1
                  FROM wgb_account wa JOIN
                       wgb_account_type wat 
                       ON wat.account_type = wa.account_type
                  WHERE wat.account_type = 'RRSP'
                 ) ;

Я бы посоветовал вам никогда не использовать natural join и просто забыть, что он вообще существует.Всегда явно указывайте условия соединения!

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

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

SELECT surname "Last", first_name "First" 
FROM wgb_customer wc JOIN wgb_account wa  on wc.customerNumber=wa.customerNumber
JOIN wgb_account_type wat on wa.account_type=wat.account_type
where not exists 
    (select 1 from wgb_account_type wat1 where wat.account_type=wat1.account_type 
      and wat1.account_type='RRSP')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...