我在数据库中有4个表:-
<- 分支/gh>存款借 客户
查询:找到那些住在那格浦尔市的客户的贷款号码,贷款城市,存款账号,存款城市?
我在下面写了一个查询,成功地获取了三个数据。
贷款没有- 贷款城市
- 存款账号
但是在获取存款城市时,我得到与贷款城市相同的数据。
下面我将分享我的代码,这样你就可以发现我错在哪里
My trying code:
SELECT borrow.loanno,
branch.city AS 'Borrow city',
deposit.actno,
branch.city AS 'Deposit city',
customer.city As 'Customer_city'
FROM customer
JOIN borrow
ON borrow.cname = customer.cname
JOIN branch
ON borrow.bname = branch.bname
JOIN deposit
ON deposit.cname = customer.cname
AND customer.city = 'Nagpur';
通过运行上面的代码,我得到的输出是
loanno Borrow city Deposit city actno Customer_city
321 Mumbai Mumbai 104 Nagpur
375 Mumbai Mumbai 105 Nagpur
我想要的输出是:-
loanno Borrow city Deposit city actno Customer_city
321 Mumbai Delhi 104 Nagpur
375 Mumbai Banglore 105 Nagpur
为了更多的理解,我分享了我的dB小提琴链接,这样你就有了一个清晰的想法。
https://www.db-fiddle.com/f/gaUYxuwuJLsWA4kFeMn9u6/6
请不要误会,但你所拥有的似乎不是一个好的数据库设计。通常,每个表都有一个基于自动增量整数的ID键,该键是唯一的,并传递到每个底层表。您的主键有字符串值。
我知道这看起来像是数据库设计的开始,但是你真的需要一些帮助。
比如说,你有5个人叫"阿尼尔",你会怎么做……你完成了。"Anil"是主键,你不能改变它。通过自动增量,您可以有1000个Anil客户,每个客户都有额外的信息来确保唯一性……名字,姓氏,地址,其他唯一信息
现在进入分支查找表。同样适用。你们在孟买有多家分行。会有重复的名字吗?可能吗? ?因此,拥有一个自动递增的ID列可以解决这个问题,而像客户这样的附加信息可以确保像地址这样的唯一性。比如"克朗提";分支。"IF"现在来存放和借用桌子。我知道它的样本数据,但只是为了说明错误是如何发生的。您的分行信息名称为"钱德拉尼",但您的存款表名称为"钱德拉尼"。(漏掉了第二个"a")。I know type-o.
当您有数据输入屏幕并找到客户或分支机构时,系统将具有给定的"id";要存储在给定的存借表中的记录的。不要基于每个Anil客户示例的字符串——如果你有100个Anil客户。ID将确保正确的客户。类似于branch。应该使用customer和branch的ID列(基于修改后的数据库/表结构)。
最后你的查询。您正在尝试将借阅表与给定人员的存款连接起来。这只会让你头疼。借款不能保证有存款(反之亦然)。现在,如果您对Anil有5次借款和7次存款,并且尝试以您拥有的方式查询这两项,您将得到返回的35条记录(笛卡尔积),因为借款表中具有匹配客户的每条记录都将应用于这些存款。
所以,足够让你考虑,坐下来,深呼吸,消化它。我可以向您展示一个更好的表结构来处理这里提供的一些上下文。
至于写查询,你真的需要用简单的英语来表达你想要得到什么,然后展示你是如何尝试的。而且,似乎没有匹配,比如存款被应用到给定的借款中,那么这里的重点/逻辑是什么?
再次,真诚地面对你所面临的困难,并愿意帮助你,但你可能比你意识到的要远。
反馈好了,这是一个赋值——一个糟糕的赋值,但还是一个赋值。问题是你只使用了一个基于借款人的分支实例。你需要的是分支表连接两次…一次给借方,一次给定金。在每一篇文章中,我都使用了"别名"。它。在加入借阅表时,我将其别名为"bbranch"。为"借枝"。对于存款,我的别名是"dbranch"。为"存款分行"。所以每一个都是分别连接的,所以每一个都将指向自己并分别拉动城市。
select
borrow.loanno,
BBranch.city as 'Borrow city',
deposit.actno,
DBranch.city as 'Deposit city',
customer.city
from
customer
join borrow
on customer.cname = borrow.cname
join Branch BBranch
on borrow.bname = BBranch.bname
join deposit
on customer.cname = deposit.cname
and customer.city = 'Nagpur'
join branch DBranch
on deposit.bname = DBranch.bname
还显示了缩进,以查看表如何/在何处连接。你可以看到它变成了
customer
borrow
branch for borrow
deposit
branch for deposit
那么你总是可以看到下游的关系,而不是重叠/交叉。
最后一项是and customer.city = 'Nagpur'
。我甚至不知道这是否是一个要求,但它是在你的查询。