1

我有三张桌子:

产品(p_id,prod_name),竞争对手(c_id,comp_name),销售(p_id,c_id,价格)。

所以假设我有数据:

(producs table)
p_id | prod_name
1    | product1
2    | product2

(competitors table)
c_id | comp_name
1    | competitor1

(sells table)
p_id | c_id | price
1    | 1    | 1.56

在某处使用 c_id = 1 ,我想检索:

prod_name | price
product1  | 1.56
product2  | NULL

问题是餐桌销售是产品和竞争对手之间唯一的关系。并且 table sells 可能没有包含产品 id 和竞争对手 id 的行。在这种情况下,我希望它返回 null 作为价格。简而言之,我想返回给定竞争对手的所有产品(假设 comp_id = 1),如果表中不存在该行,则返回价格或 null 销售。

我试过这个,但它没有用,因为它没有返回 NULL 价格:

SELECT prod_name, price
  FROM products
  LEFT JOIN sells ON products.p_id = sells.p_id
  LEFT JOIN competitors ON sells.c_id = competitors.c_id
 WHERE competitors.c_id = 1

我怎样才能在 SQL 中做到这一点?

4

4 回答 4

1
select prod_name, price 
from products 
left join sells 
    on products.p_id = sells.p_id 
left join competitors 
    on sells.c_id = competitors.c_id 
AND competitors.c_id = 1
于 2012-07-27T13:17:16.650 回答
0

您希望右加入竞争对手而不是左加入。右连接将返回右表中的所有记录,而不管左表中是否有任何记录;这与左连接的行为相反。

于 2012-07-27T13:18:11.817 回答
0

这应该有效(参见SQL Fiddle):

select prodname, price
from products p
left join sells s
  on p.pid = s.pid
left join competitors c
  on s.cid = c.cid
where c.cid = 1 
  or c.cid is null
于 2012-07-27T13:29:06.577 回答
0
SELECT p.prod_name, s.price
FROM products p
LEFT JOIN sells s ON p.p_id = s.p_id
WHERE s.c_id = 1
于 2012-07-27T13:34:19.730 回答