在理解自然连接时,我遇到了查询:
查找在银行拥有帐户并居住在哈里森的客户的分支机构名称
本书中的关系代数表达式如下:
使用查询实现相同的内容:
select distinct a.branch_name from depositor d, account a, customer where d.account_number=a.account_number and customer.customer_city='Harrison';
我得到虚假的元组如下:
+-------------+
| branch_name |
+-------------+
| Perryridge |
| Downtown |
| Brighton |
| Redwood |
| Mianus |
| Round Hill |
+-------------+
6 rows in set (0.00 sec)
但查询必须根据模式仅返回Brighton和Perryridge,如下所示:
mysql> select * from account;
+----------------+-------------+---------+
| account_number | branch_name | balance |
+----------------+-------------+---------+
| A101 | Downtown | 500 |
| A102 | Perryridge | 400 |
| A201 | Brighton | 900 |
| A215 | Mianus | 700 |
| A217 | Brighton | 750 |
| A222 | Redwood | 700 |
| A305 | Round Hill | 350 |
+----------------+-------------+---------+
7 rows in set (0.00 sec)
mysql> select * from customer;
+---------------+-----------------+---------------+
| customer_name | customer_street | customer_city |
+---------------+-----------------+---------------+
| Adams | Spring | Pittsfield |
| Brooks | Senator | Brooklyn |
| Curry | North | Rye |
| Glenn | Sand Hill | Woodside |
| Green | Walnut | Stamford |
| Hayes | Main | Harrison |
| Johnson | Alma | Palo Alto |
| Jones | Main | Harrison |
| Lindsay | Park | Pittsfield |
| Smith | North | Rye |
| Turner | Putnam | Stamford |
| Williams | Nassau | Princeton |
+---------------+-----------------+---------------+
12 rows in set (0.00 sec)
mysql> select * from depositor;
+---------------+----------------+
| customer_name | account_number |
+---------------+----------------+
| Hayes | A102 |
| Johnson | A101 |
| Johnson | A201 |
| Jones | A217 |
| Lindsay | A222 |
| Smith | A215 |
| Turner | A305 |
+---------------+----------------+
7 rows in set (0.00 sec)
我在哪里犯了错误?
答案 0 :(得分:2)
您可能会忘记存款人和客户之间的联系。
depositor.customer_name = customer.customer_name
所以整个查询应该是:
SELECT DISTINCT a.branch_name
FROM depositor d, account a, customer
WHERE d.account_number = a.account_number
AND d.customer_name = customer.customer_name
AND customer.customer_city='Harrison'
结果:
+-------------+
| branch_name |
+-------------+
| Perryridge |
| Brighton |
+-------------+
2 rows in set (0.00 sec)
答案 1 :(得分:1)
你没有为客户表加入,你的查询应该是这样的
Select a.branch_name
From depositor d
Join account a
on d.account_number=a.account_number
Join customer as c
on d.customer_name = c.customer_name
Where c.customer_city='Harrison'
我不知道如何通过名称将客户表加入存款人,或者如果您有一些钥匙只需更换它,您就会得到结果。
如何在where useful link
中创建联接