我有顾客,物品,制造商,订单,库存等表格。请参阅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条记录?
答案 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_code
。 stock_num
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'