2009-07-11 17 views
1

TSQL(MSSQL SERVER)で左結合を実行すると、右側に複数の行がある場合、どの行がクエリで返されるかは保証されますか?TSQLは複数の右手行で左結合

私はこれを使用して、正しい表の注文を悪用しようとしています。

はそう

Select ColA, ColB, ColC 
from T 
Left Outer Join 
    (Select ColA, ColB, ColC 
    from T--CLARIFIED, this is a self join. 
    Order by TopColumn Desc) AS OrderedT(ColA, ColB, ColC) 
    On T.ColA = OrderedT.ColA 

私は私の左のためのコーラ結果のセット内のすべてのコーラの表では、すべての最初の行を取得することを期待するが、私の順序に基づいて参加します。

これは言語またはサーバーによって保証されていますか?

+1

名前を変更しましたが、問題を助けていません。 'mssql'と6000以上のタグ付き 'sql-server'という4つの質問しかありません。それを考えて、あなたはどちらが正しいと思いますか?あなたはここで長く知り合っていなければなりません。 –

+0

私はMSSQL Serverとして意図的にタグ付けされています。私の質問はそのサーバーに関係しているため、MSSQLサーバーとOracleアクセスなどの間でこの動作が異なる場合があります。 – Spence

+1

sql-serverタグはMS SQL Serverを意味します。また、 'oracle'、 'mysql'、 'ms-access'、および他のデータベースのフレーバのための別個のタグがあります。再度:質問を投稿するときにプロンプ​​トを確認します。タグが10より小さいタグは、ほぼ間違っています。 –

答えて

4

...バージョン管理テーブル用

select T.ColA, T.ColB, T.ColC 
from T 
inner join 
    (select ColA, max(TopColumn) MaxTopColumn 
    from T 
    group by ColA) OrderedTable 
    on T.ColA = OrderedTable.ColA and T.TopColumn = OrderedTable.MaxTopColumn 

かなり一般的なクエリは、内部が最大クエリに結合が必要。

テーブル名「表は、」私は、タグの自動提案するプロンプトにもっと注意を払うしてくださいそれT.

+0

TopColumnがグループに含まれていないと不満を持ちませんか?または、その集約形式のため、それはOKです – Spence

+0

結合の2番目の部分も同様に必要ですか? Cola = ColAの参加は十分ではないでしょうか? – Spence

+0

クエリ内の非集約列によって集計します。 SQL Serverを手にする必要はありませんが、このクエリはMSQLServerとSybaseで数十回書かれていますが、これは正しい構造です。 集計クエリはテーブルスキャン(または完全なインデックススキャン)であり、その周囲には方法がありません。パフォーマンスは完璧ではありませんが、これはクエリです。 –

2

それほど簡単ではありません。 LEFT JOINは、一致するすべての右側の行を返します。したがって、ここでの保証に関する質問は、実際には関係ありません。副問合せでTOP 1を使用して、必要な単一の行を取得するために、副問合せで何かを行う必要があります。

+0

しかし、私はトップ1を集計として使うことはできません。これは、カーソルを避けようとしている各行の最上位行をフェッチする問題を解決するためだけのものです。 – Spence

+0

@David M: "LEFT JOINは、すべての一致する右側の行を返します" - 間違った方法ではありませんか? –

+1

No. LEFT JOINは、すべての行を左から返し、**すべての一致する行を**右から返します。 –

1

LEFT JOINは、(ジョインキーの)右側に一致する行があるかどうかにかかわらず、WHERE条件を満たすすべての左手の行を返します。右側の表の列は、結合キーに一致するものがない場合はNULLとして戻されます。私はあなたがこれを必要とすると信じて

+0

わかりました、私は自己参加であるということで私の質問を明確にしました。したがって、クエリは右側にNULLを持ちません。しかし、非常に有効なポイント。 – Spence