2016-11-21 11 views
0

私はこれら2つのクエリを自分のDBで実行します。最初のレコードは1レコードを返し、2レコード目は2241を返します(予想通り)。私は同じことを2つの異なる方法で尋ねます。最初はDISTINCTを使用し、2番目は「GROUP BY」を使用します。これらは同じではありませんか?DISTINCTとGROUP BYで異なる結果

/*returns 1 record*/ 
SELECT DISTINCT INVENTORY.location, INVENTORY.label, INVENTORY.version, SUM(INVENTORY.quantity) AS total, LABELS.description, LABELS.customer , LABELS.label 
FROM INVENTORY 
INNER JOIN LABELS 
ON INVENTORY.label = LABELS.label 
AND INVENTORY.version = LABELS.version 
WHERE INVENTORY.location = 1 

/*returns 2241 record*/ 
SELECT Inventory.location, Inventory.label, Inventory.version, SUM(INVENTORY.quantity) AS total, Labels.description, Labels.customer, LABELS.label 
FROM Inventory 
INNER JOIN LABELS 
ON Inventory.label = Labels.label 
AND Inventory.version = Labels.version 
WHERE Inventory.location = 1 
GROUP BY Inventory.label, Inventory.Version 
+4

実際には両方とも無効SQL最初のものは必要な 'group by'を完全に欠いており、2番目はすべての非集約カラムをグループ化していません。私はSQLiteもそれを受け入れることに驚いています。 –

+0

私は何かエラーはありません...! – yaylitzis

+0

@a_horse_with_no_name DISTINCTにGROUP BYが必要なときは? – m0skit0

答えて

1

どちらのクエリは、ANSI SQLによると無効であるが、それは、MySQLをリリースからのOracleを停止していない、またそれは、これらのクエリを書くことからあなたを停止でした。ここ

SELECT Inventory.location, 
     Inventory.label, 
     Inventory.version, 
     SUM(INVENTORY.quantity) AS total, 
     Labels.description, 
     Labels.customer, 
     LABELS.label 
FROM Inventory 
INNER JOIN LABELS 
    ON Inventory.label = Labels.label AND 
     Inventory.version = Labels.version 
WHERE Inventory.location = 1 
GROUP BY Inventory.location, 
     Inventory.label, 
     Inventory.version, 
     Labels.description, 
     Labels.customer, 
     LABELS.label 

キーポイントのような、どちらかもSELECT節に現れるすべての列は集計関数内GROUP BYまたはが表示さに表示されていることをされています。ここでは、未遂2つのクエリの有効なバージョンがありますSUM

あなたのクエリは、クエリに厳密さを課していると怠惰なMySQLと互換性があるため、SQLite上で実行されました。

+1

公正であること:MySQLで壊れた' group by'実装を導入したのはOracleではありませんでした –

+1

Thx情報!私は今日もう一つの事を学びます! – yaylitzis

関連する問題