4

SQL クエリに問題があり、気が狂いそうです。グループを機能させることができないようです。次のエラーが発生し続けます。

00979. 00000 -  "not a GROUP BY expression"

私のクエリ:

SELECT customers.customer_first_name, customers.customer_last_name, orders.customer_numb, books.author_name, books.title
FROM customers
LEFT OUTER JOIN orders ON (orders.customer_numb = customers.customer_numb)
LEFT OUTER JOIN order_lines ON (order_lines.order_numb = orders.order_numb)
LEFT OUTER JOIN books ON (books.isbn = order_lines.isbn)
WHERE (customers.customer_numb = 6)
GROUP BY (books.title)

データベース スキーマ:

顧客:

ここに画像の説明を入力

注文明細と注文:

ここに画像の説明を入力

私が達成しようとしていること: 重複したタイトルが表示されないように、本のタイトルでグループ化しようとしています。

何か見落としがありましたら申し訳ありません、ありがとうございます。

4

3 に答える 3

14

何がわからないの?select ステートメントには、group by句に含まれていない多くの列が含まれています。これを試して:

SELECT customers.customer_first_name, customers.customer_last_name, orders.customer_numb, books.author_name, books.title 
FROM customers 
LEFT OUTER JOIN orders ON (orders.customer_numb = customers.customer_numb) 
LEFT OUTER JOIN order_lines ON (order_lines.order_numb = orders.order_numb) 
LEFT OUTER JOIN books ON (books.isbn = order_lines.isbn) 
WHERE (customers.customer_numb = 6) 
GROUP BY customers.customer_first_name, customers.customer_last_name, orders.customer_numb, books.author_name, books.title  

何も集約していないため、 , を省略して、節group byで使用するだけです。distinctselect

select distinct  customers.customer_first_name, customers.customer_last_name, orders.customer_numb, books.author_name, books.title 
于 2012-10-12T17:11:01.347 に答える
0

あなたが欲しいのは、顧客のリストと彼らが購入した個別の本のようです。私はこのようにクエリを書き直します、それはあなたが望むことをするはずです:

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つの行に集約してから、グループ内のすべての行の各行に集約されたものを結合します。正確に直感的な動作ではありません。

于 2012-10-12T18:22:18.813 に答える
0
SELECT DISTINCT customers.customer_first_name, customers.customer_last_name, orders.customer_numb, books.author_name, books.title
FROM customers
LEFT OUTER JOIN orders ON (orders.customer_numb = customers.customer_numb)
LEFT OUTER JOIN order_lines ON (order_lines.order_numb = orders.order_numb)
LEFT OUTER JOIN books ON (books.isbn = order_lines.isbn)
WHERE (customers.customer_numb = 6)

代わりに DISTINCT を使用してください。

于 2012-10-12T17:11:55.560 に答える