无法正确加入3个表

时间:2015-06-21 08:44:23

标签: mysql relational-algebra natural-join

在理解自然连接时,我遇到了查询:

  

查找在银行拥有帐户并居住在哈里森的客户的分支机构名称

本书中的关系代数表达式如下:

enter image description here

使用查询实现相同的内容:

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)

我在哪里犯了错误?

2 个答案:

答案 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

中创建联接