13

I have the following table in SQL Server 2008:

CREATE TABLE tbl (ID INT, dtIn DATETIME2, dtOut DATETIME2, Type INT)

INSERT tbl VALUES
(1, '05:00', '6:00', 1),
(2, '05:00', '7:00', 1),
(3, '05:01', '8:00', 1),
(4, '05:00', '8:00', 1),
(5, '05:00', '6:00', 2),
(6, '05:00', '7:00', 2)

that selects IDs of all records of the same type, with the same dtIn date, ordered by stOut in ascending order:

SELECT DISTINCT tbl.id FROM tbl   
  LEFT JOIN tbl AS t1
  ON tbl.type = t1.type AND
     tbl.dtIn = t1.dtIn
  ORDER BY tbl.dtOut ASC

But it gives me an error:

ORDER BY items must appear in the select list if SELECT DISTINCT is specified

I tried putting that ORDER BY in different places and it all doesn't seem to work. What am I doing wrong here?

4

5 に答える 5

9

DISTINCTアイテムのリストに含まれていない列でORDERすることは意味がありません。

簡単なシナリオを使用してみましょう。まず、テーブルFruitPerson

Fruit  PersonName
-----  ------
Apple  Joe
Apple  Mary
Peach  Karen
Peach  Lance

これがあなたがやろうとしていることと同等のクエリです:

SELECT DISTINCT Fruit
FROM FruitPerson
ORDER BY PersonName;

なしのこのクエリの結果は次のORDER BYとおりです。

Fruit
-----
Apple
Peach

しかし今、問題は、エンジンがこれら2つの値「Apple」と「Peach」をどのように順序付けるべきかということPersonNameです。どのPersonNames?果物ごとに2人がいます!正確には、どの名前を使用して最初に来るかどうAppleかを決定する必要がありますか?Peach

代わりに、クエリを集計として書き直してください。

SELECT Fruit, MinName = Min(PersonName) -- which name to order on
FROM FruitPerson
GROUP BY Fruit -- here's how you get your distinctness
ORDER BY MinName;
于 2012-07-20T21:22:56.520 に答える
8

個々の ID に絞り込むと、各 ID に複数の ID がdtOut関連付けられる可能性が生じます。その場合、Sql Server は使用する順序をどのように認識しますか?

あなたは試すことができます:

SELECT t1.id
FROM tbl t1
LEFT JOIN  tbl t2 on t1.type = t2.type AND t1.dtIn = t2.dtIn
GROUP BY t1.id, t2.dtOut
ORDER BY t2.dtOut

ただし、上で述べたように、右側のテーブルの複数のレコードに一致する場合、同じ ID が複数回リストされる可能性があります。

于 2012-07-20T21:25:27.133 に答える
0

「DISTINCT」キーワードを使用する場合、SELECT ステートメントの一部である ORDER BY 句の列のみを使用できます。したがって、tbl.id でのみ注文できます

ID が一意の場合、DISTINCT キーワードは意味がなく、パフォーマンスが低下するため、削除するだけです。そうではなく、DISTINCT を維持しながら tbl.dtOut も選択することにした場合、tbl.id と tbl.dtOut のペアは、おそらく望ましくない同じ tbl.id を持つ複数のエントリを与える可能性があります。

考えられる回避策と、そのようなクエリが禁止されている理由については、この記事を確認してください。

于 2012-07-20T21:11:00.803 に答える
0

(tbl.dtOut) を選択リストに入れなかったため、このエラーが発生していました。

SELECT DISTINCT tbl.dtOut FROM tbl    
  LEFT JOIN tbl AS t1  
  ON tbl.type = t1.type AND  
     tbl.dtIn = t1.dtIn  
  ORDER BY tbl.dtOut ASC

結果セット(3行)を取得し、idフィールドも必要な場合は

SELECT DISTINCT tbl.dtOut, tbl.ID FROM tbl      
  LEFT JOIN tbl AS t1  
  ON tbl.type = t1.type AND  
     tbl.dtIn = t1.dtIn  
  ORDER BY tbl.dtOut ASC  

(ID/日付フィールドの異なる組み合わせを提供するため、6行あります)

于 2012-07-20T23:32:15.287 に答える
0

列 tbl.dtOut を選択リストに含めて、何を注文するかを認識できるようにする必要があります。

SELECT DISTINCT tbl.id, tbl.dtOut FROM tbl   
  LEFT JOIN tbl AS t1
  ON tbl.type = t1.type AND
     tbl.dtIn = t1.dtIn
  ORDER BY tbl.dtOut ASC
于 2012-07-20T21:13:08.063 に答える