2012-02-21 7 views
0

まず、私は苦労してるテーブル遭遇したとき:サブから結果セットを使用してSELECT重複行がすべての

DispatchLocations 
================= 
DispatchID  int 
StopNumber  int 
Arrived   bool 
Departed   bool 

を考えはトラック輸送ルート上で、中に多くの停止があるということですディスパッチ。これは、各ディスパッチ上の各ロケーションのリストです(本質的にルートテーブルです)。このビューでは、ディスパッチが存在する「現在の停止」を指す、出力の各行に対して1つのディスパッチのみが存在する必要があります。今のよう

SELECT TOP 4 
    DispatchID, 
    Min(StopNumber) AS NextStop, 
    Arrived, 
    Departed 
FROM DispatchLocations 
GROUP BY 
    DispatchID, 
    Arrived, Departed 
HAVING (Arrived = 0 OR Departed = 0) 
ORDER BY DispatchID ASC, NextStop ASC 

マイビューの出力:GROUP BYは、出力の一意性を壊し、到着と出発のステータスを含まなければならないので、

Dispatch_ID NextStop Arrived Departed 
=========== ======== ======= ======== 
3    2   False  False 
1356   2   False  False 
6410   1   True  False 
6410   2   False  False 

は、最後の行がでダンプされています。

希望行は(のみ)に非常に類似したクエリを使用して抽出することができます。

SELECT 
    DispatchID, 
    Min(StopNumber) AS NextStop, 
    Arrived, 
    Departed 
FROM DispatchLocations 
GROUP BY 
    DispatchID, 
    Arrived, Departed 
HAVING 
    (Arrived = 1 AND Departed = 0) AND Min(StopNumber) = 1 
ORDER BY DispatchID ASC 

Dispatch_ID NextStop Arrived Departed 
=========== ======== ======= ======== 
6410   1   True  False 
50589   1   True  False 
50687   1   True  False 

は私が私の見解 WHERE COUNT(DispatchID) > 1からすべてのDispatchIDsを選択することで、これらの結果を検証しました。

ビュー内で一致するIDが見つかるたびに、2番目のクエリの結果を使用するにはどうすればよいですか? EXISTまたはEXCEPT句をHAVINGのクエリテキストに含めることができません。だから、私は結果をデータベースの手に渡し、アプリケーションロジックが重複した結果を並べ替え、各ディスパッチIDに対して最初に見つかったものだけを保持するようにしています。しかし、私はむしろデータベースを使ってこれを私に任せています。

UPDATE

私はデフォルトで含まTOP 100 PERCENTと意見を構築SSMS 2008を、使用しています。オリジナルのpastebinは次のとおりです。これは、各ディスパッチIDの最安stopnumberの詳細を返します

SELECT dl.DispatchID, 
     dl.StopNumber AS NextStop, 
     dl.Arrived, 
     dl.Departed 
FROM DispatchLocations dl 
     INNER JOIN 
     ( SELECT DispatchID, MIN(StopNumber) [StopNumber] 
      FROM DispatchLocations 
      GROUP BY DispatchID 
     ) MinDL 
      ON MinDL.DispatchID = dl.DispatchID 
      AND MinDL.StopNumber = dl.StopNumber 

+0

これはどのRDBMSですか?私はあなたが 'VIEW'に' ORDER BY'を持っているので、SQL Serverを推測していません。 – JNK

+0

@JNK - ビューで、または有効なテーブル式が期待されるところで、 'TOP'とともに' ORDER BY'を使うことができます。 –

+0

@JCooper投稿したビューの定義に 'TOP'がないことに気づきます – JNK

答えて

0

は、私はあなたがこのような何かをしたいと思います。これを単にWHEREを使ってフィルタリングすることができます。例えば。私は完全に質問を誤解しているかもしれないが

Dispatch_ID NextStop Arrived Departed 
=========== ======== ======= ======== 
6410   1   True  False 
50589   1   True  False 
50687   1   True  False 

WHERE Arrived = 1 
AND Departed = 0 

私は一番上のselect文に上記を追加すると、結果を戻すことになると思います。

+0

私はすでにこれらの行に沿って何かを試しましたが、私は派生したテーブルに朝の仕事で再構築します。その後、更新を投稿してください。 – Droogans

関連する問題