web-dev-qa-db-ja.com

内部結合で並べ替え

私はクエリに内部結合を入れていますが、結果は出ていますが、データがどのように出力されるのかわかりませんでした。 2つのテーブル(1つまたは2つのテーブル)。

alt text

私によると、最初の行はMohitであるべきですが、出力は異なります。教えてください。

前もって感謝します。

17
Mohit Kumar

データを特定の方法で戻すには、ソートする必要があります。 「Mohit」が最初の行であることを期待していると言うとき、「Mohit」が[One]テーブルの最初の行であるため、あなたが言うと仮定しています。ただし、SQL Serverがテーブルを結合する場合、必ずしも思った順序で結合するとは限りません。

[One]の最初の行を返す場合は、[One].[ID]でソートしてみてください。または、order by他の列を使用できます。

5
dotariel

SQLでは、ORDER BY句で指定しない限り、出力の順序は定義されません。

これを試して:

SELECT  *
FROM    one
JOIN    two
ON      one.one_name = two.one_name
ORDER BY
        one.id
11
Quassnoi

メインクエリではSELECT *を避けてください。

列の重複を避ける:JOIN条件により、One.One_Nametwo.One_Nameが等しくなるため、SELECT句で両方を返す必要はありません。

列名の重複を避けます。「エイリアス」を使用して、One.IDTwo.IDの名前を変更します。

SELECT句の列名(該当する場合は「エイリアス」)を使用してORDER BY句を追加します。

推奨される書き換え:

SELECT T1.ID AS One_ID, T1.One_Name, 
       T2.ID AS Two_ID, T2.Two_name
  FROM One AS T1
       INNER JOIN two AS T2
          ON T1.One_Name = T2.One_Name
 ORDER 
    BY One_ID;
5
onedaywhen

最初のクエリの最後にORDER BY ONE.ID ASCを追加します。

デフォルトでは順序付けはありません。

3
JNK

SQLは、この方法の方が高速であるため、デフォルトでは順序を返しません。最初にデータを調べてから、何をすべきかを決める必要はありません。

Order by句を追加する必要があります。おそらく、予想されるIDで並べ替える必要があります。 (名前の重複があるため、One.IDが必要だと思います)

select * From one
inner join two
ON one.one_name = two.one_name
ORDER BY one.ID
1
Tyug

参加時にこれが問題であることがわかりましたが、このブログは参加者がどのように機能するかを理解するのに役立ちます。 結合の仕組み..

[編集] @Shreeそれを指摘してくれてありがとう。結合の結合の段落。結合の仕組みについて言及しています...

ハッシュ結合と同様に、マージ結合は2つのステップで構成されます。最初に、結合の両方のテーブルが結合属性でソートされます。これは、外部マージソートを介して各テーブルを2回パスするだけで実行できます。最後に、次の順序付けられた要素が各テーブルから取り出され、結合属性が比較されると、結果のタプルが生成されます

0
Muzamir