sql内连接不适用于内连接

时间:2017-10-07 18:45:07

标签: mysql sql

我有顾客,物品,制造商,订单,库存等表格。请参阅http://www.oninit.com/manual/informix/english/docs/gn7382/4366.pdf

我想得到每个人(以及他们所居住的城市和州)的名字和姓氏,他们已经订购了公司史密斯制作的东西。包括描述(来自股票表)。

如果我执行第一部分

select c.fname, c.lname, c.city, c.state from customer c join orders o using (customer_num)
join items i using(order_num)
join manufact m using(manu_code)  where m.manu_name = 'Smith' ;

我得到8条记录是正确的,我还想从库存表中获取这些记录的描述,所以我在库存表上创建了一个连接,如

select c.fname, c.lname, c.city, c.state, s.description from customer c join orders o using (customer_num)
join items i using(order_num)
left join (manufact m join stock s on m.manu_code=s.manu_code) on m.manu_code = i.manu_code where m.manu_name = 'Smith';

现在,它给了我24条记录,我不指望。 如何编写嵌套查询以仅获取8条记录?

股票架构enter image description here

2 个答案:

答案 0 :(得分:0)

您有24个制造商的库存商品。您需要决定要显示的内容。

您的查询正在执行您希望它执行的操作。

我会说,在没有嵌套连接的情况下构造查询更简单。你还遗漏了description

select c.fname, c.lname, c.city, c.state, s.description
from customer c join
     orders o
     using (customer_num) join
     items i
     using (order_num) join
     manufact m
     using (manu_code) join
     stock s
     using (manu_code)
where m.manu_name = 'Smith';

我还怀疑stock有一些你应该加入的itemid

答案 1 :(得分:0)

您可以在库存表中看到,stock_num有多个manu_codestock_num

的相应manu_code有3个m.manu_name = 'Smith'

这就是为什么你的查询返回8 * 3 = 24行。

要获得适当的结果,您可以

select c.fname, c.lname, c.city, c.state, s.description
from customer c 
     join orders o using (customer_num) 
     join items i using (order_num) 
     join manufact m using (manu_code) 
     join (select description from stock group by manu_code) AS s ON s.manu_code = m.manu_code
where m.manu_name = 'Smith'