あなたが欲しいのは、顧客のリストと彼らが購入した個別の本のようです。私はこのようにクエリを書き直します、それはあなたが望むことをするはずです:
select c.customer_first_name ,
c.customer_last_name ,
c.customer_numb ,
b.author_name ,
b.title
from customers c
left join ( select distinct
o.customer_numb ,
ol.isbn
from orders o
left join order_lines ol on ol.order_number = orders.order_numb
) cb on cb.customer_numb = c.customer_numb
join books b on b.isbn = cb.isbn
where c.customer_numb = 6
購入した各タイトルの数をカウントする場合は、from句の派生テーブル(別名インラインビューまたは仮想テーブル)を変更して、適切な集計関数を結果セットに追加するのgroup by
ではなく、使用するようにします。select distinct
ここで、元のクエリが南に移動します。結果セットのすべての列は、次のいずれかである必要があります。
group by
句の列または式、
- リテラル、または..。
- 集計関数
ここにはいくつかの例外があり(たとえば、列と集計関数のグループ化のみに依存する式を使用できます)、SQL標準では他の列が許可されていると推定されますが、ほとんどの実装では許可されていません。
顧客と注文の間に1対多の関係があり、個々の注文が1つの住所または別の住所に発送される可能性がある、このようなクエリについて考えてみます。
select c.customer_id , o.shipping_address , orders = count(*)
from customer c
join order o on o.customer_id
group by c.customer_id
o.shipping_address
この文脈での意味は何ですか?注文を顧客IDでグループ化し、グループ全体を1つの行にまとめました。customer_id
それがグループ化の基準であるため、簡単です。グループ全体は、定義上、同じ値を共有します。count(*)
グループ内の行の数にすぎないため、これも簡単です。
ただし、「shipping_address」には問題があります。グループには配送先住所の値が複数ある可能性がありますが、集約されたグループは1つの値しか返すことができません。初め?最後?他に何かありますか?
SQL Serverには、そのような奇妙なものを許可する非常に非標準的な実装がありました。この場合は、基本的にグループを1つの行に集約してから、グループ内のすべての行の各行に集約されたものを結合します。正確に直感的な動作ではありません。