嗨,我正在尝试找出以下问题。
这是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;
但是,它表示未选择任何行。 请帮忙!
答案 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)
我建议使用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
,而要完全忘记它的存在。始终明确列出的加盟条件!
答案 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();
}