自然连接和减号

时间:2019-02-01 04:24:01

标签: sql oracle join

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 :(得分:0)

您可以在下面使用相关子查询尝试

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')

答案 1 :(得分:0)

如果我正确阅读了该问题,则说明您使用的是错误的自然联接,应该考虑使用外部自然联接。这也意味着您将不需要minus关键字。

您可以转到此link了解有关联接的更多信息。

我要从该文档中指出的那一行是,自然联接将被视为“内部”联接。这意味着您的公共列正在检查的键将必须存在于两个表中。您想要的是仅存在于一个表中的内容,因此存在外部联接。祝你好运!

答案 2 :(得分:0)

我建议使用existsnot 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,而要完全忘记它的存在。始终明确列出的加盟条件!

答案 3 :(得分:0)

您只是缺少RRSP帐户的搜索条件,例如

#include <stdio.h>
int n = 5;
int i, j, k, x = 1, temp;
int array[] = {5, 1, 4, 5, 7};

void swap(){
    temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

void sorting(){
    for (i = 0; i < n; i++){
        for (j = i + 1; j < n; j++){
            if (array[i] > array[j]){
                swap();
            }
        }
    }
}

void checking(){
    sorting();
    for (k = 0; k < n; k++){
        if (x != array[k]){
            printf('%d',array[k]);
            break;
        }
            else x++;
    }
}

int main()
{
    checking();
}