0

次のテーブルから、少なくとも 2 つの製品を注文した顧客を取得したいと考えています。テーブルは次のとおりです。

Customer(Id, Name, City),
Product(Id, Name, Price),
Orders(Customer_Id, Product_Id, Date)

クエリを使用します

select c.*
from customer c
join orders o on o.customer_id = c.id
group by c.id
having count(o.customer_id) >= 2 

期待される結果を返しますが、 を に置き換えてJOINLEFT JOIN同じ結果が得られます。で規定されているように、Customer テーブルのすべての行が返されるわけではありませんLEFT JOIN。この機会にの機能がLEFT JOIN制限されるのはなぜですか? 試合の結果と左の表にのみ表示される結果を区別できない人がいるという事実のためですか?

4

2 に答える 2

2

LEFT JOIN は期待どおりに機能しますが、結合の結果に影響を与える他のものがあります。

特に、HAVING 句は、テーブルに 2 つ以上の一致がある顧客のみを受け入れordersます ( COUNT(o.customer_id) >= 2)。確かに、顧客に注文がない場合、LEFT JOIN 操作によって返されますが、HAVING によって除外されCOUNT(o.customer_id)ます。

少なくとも 2 つの注文がある顧客、または注文がない顧客を返したい場合は、クエリで次のように指定します。

select c.*
from customer c
left join orders o on o.customer_id = c.id
group by c.id
having count(o.customer_id) >= 2
   or count(o.customer_id) = 0

またはこのように:

select c.*
from customer c
left join orders o on o.customer_id = c.id
group by c.id
having count(o.customer_id) <> 1
于 2013-05-15T11:39:30.110 に答える
0

注文表に対応する行がない場合、o.customer_id は null です。COUNT は、null 以外の値のみをカウントします。COUNT(1) または COUNT(c.customer_id) を試して、目的の結果が得られるかどうかを確認してください。

于 2013-05-14T17:43:49.670 に答える