-1

私はこのクエリを持っています:

SELECT C.ID_PASS, C.ID_MERCE, CTRL.ESITO, M.ID_CAT, M.QTA, M.DESCRIZ, 
   CTRL.ID_PUNTO, CTRL.ID_ADDETTO, C.DATE_OPEN, C.DATE_CLOSE, C.NOTE

FROM   CONTESTAZIONI C, CONTROLLI CTRL, FUNZIONARI F, ADDETTI A, MERCI M

WHERE  A.ID=CTRL.ID_ADDETTO
  AND    A.ID_FUNZ=501
  AND    M.ID=C.ID_MERCE
  AND    M.ID_PASS=C.ID_PASS
  AND    CTRL.ESITO > 1
GROUP  BY C.ID_PASS;

GROUP BY C.ID_PASSを追加しないと、(2 行ではなく) 20 行になるのはなぜですか。

4

5 に答える 5

1

GROUP BY は、SUM や COUNT などの集計関数を使用するときに行をグループ化するために使用されます。

たとえば、顧客 ID ごとに 2 つのレコードがあり、それぞれに値があるとします。

CustId    Spend
1         10
1         20
2         30
2         40

各顧客の各値の合計を知りたい場合は、次のように使用します。

SELECT CustId, SUM(Spend) FROM SomeTable GROUP BY CustId 

これはあなたに与えるでしょう

CustId    Sum(Spend)
1         30
2         70

それが行うことの一部は、重複した行を削除し、すべての値を 1 つの行に合計することです。

集計関数なしで重複を削除するために悪用される可能性があり、これがあなたが行ったことです。したがって、20 ではなく 2 レコードになります。

GROUP BY 変数になく、GROUP BY フィールドに 100% 依存していないフィールドが SELECT にある場合、そのフィールドの値は不確定であることに注意してください。

例えば

CustId    Spend  ShopId
1         10     1
1         20     2
2         30     3
2         40     4

各顧客の各値の合計を知りたい場合は、次のように使用します。

SELECT CustId、ShopId、SUM(Spend) FROM SomeTable GROUP BY CustId

これはあなたに与えるでしょう

CustId    Sum(Spend)  ShopId
1         30          Could be 1 or could be 2
2         70          Could be 3 or could be 4

あなたのクエリでは、これはおそらくフィールドCTRL.ESITO、M.ID_CAT、M.QTA、M.DESCRIZ、CTRL.ID_PUNTO、CTRL.ID_ADDETTOに適用されます。

于 2013-06-26T15:38:56.503 に答える
1

「、」演算子で結合すると、外積が得られます。すべてのテーブルの ID を where 句に含める必要があります。

基本的に、行の ID が等しいことを確認して 5 つのテーブルすべてをリンクする必要があります。これは、コメントに記載されているように、テーブルの 2 つのグループがありますが、リンクされておらず、結果のセットに多くの重複があるためです。

于 2013-06-26T14:12:44.490 に答える
0

皆様のおかげです。今、私は理解しました: select に入れたすべてのテーブルを一緒に結合する必要があります (もちろん、リレーションシップにあるものだけです)。この結合がなければ、外積が得られます。「JOIN...ON...」または「WHERE...」のいずれかで参加できます。私はWHEREで結合しました。今すぐ正常に動作します:

SELECT C.ID_PASS, C.ID_PUNTO, C.ID_ADDETTO, C.TIME_START,
   C.TIME_END, C.ESITO, P.ID_NAZ, C.ID_MERCE, M.QTA, M.DESCRIZ, M.ID_CAT
FROM CONTROLLI C, PASSEGGERI P, MERCI M, FUNZIONARI F, CATEGORIE, ADDETTI, NAZIONI
WHERE 
    ADDETTI.ID=C.ID_ADDETTO
AND P.ID=M.ID_PASS 
AND P.ID_NAZ=NAZIONI.ID
AND M.ID_PASS=C.ID_PASS AND M.ID=C.ID_MERCE  -- composite PK (so another AND reuqired)
AND M.ID_CAT=CATEGORIE.ID
AND F.ID=ADDETTI.ID_FUNZ
AND ESITO > 1 
AND F.ID = 501
于 2013-06-27T15:05:14.920 に答える