繁体   English   中英

sql内部联接不适用于内部联接

[英]sql inner join not working for inner join

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

我想获得订购了Smith公司所制造的东西的每个人(及其居住的城市和州)的名字和姓氏。 包括描述(来自库存表)。

如果我执行第一部分为

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条正确的记录,我进一步希望从stock表获得这些记录的描述,因此我在stock表上创建了一个联接

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条记录?

库存模式在此处输入图像描述

您有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

你可以从你的股票表看到,有多个stock_nummanu_code m.manu_name = 'Smith'对应的manu_code有3个stock_num

这就是为什么您的查询返回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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM