sql >> データベース >  >> RDS >> Sqlserver

2 つの異なる結果セットを取得するこれら 2 つのクエリの違いは何ですか?

    これを INNER JOIN で実行しても、実際には違いはありません。

    ただし、LEFT または RIGHT JOIN を使用すると、できます。 追加のフィルターを JOIN に入れるか WHERE 句に入れるかで違いが生じます。

    フィルタを WHERE 句に入れると、SQL Server は最初に結合を行い、次に完全に結合します。 フィルタが適合しない行を除外します。
    --> これにより、返される行数が減少します

    フィルターを JOIN に配置すると、SQL Server は結合中にフィルター処理を行いますが、フィルターを配置したテーブルに対してのみです。
    他のテーブルからすべての行を取得しますが、それらのテーブルのみにデータがあります。
    -->これにより行数が減ることはありませんが、フィルター テーブルからのデータを含む列はより多くの行で空になります

    説明するのは難しいです...もっと明確にするために、例を挙げます:

    RedFilter の回答 :

    CREATE TABLE [dbo].[t1](
        [ID] [int] NULL,
        [StatusID] [int] NULL
    ) ON [PRIMARY]
    CREATE TABLE [dbo].[t2](
        [ID] [int] NULL
    ) ON [PRIMARY]
    INSERT INTO t1 (ID, StatusID) VALUES (1, 10)
    INSERT INTO t1 (ID, StatusID) VALUES (2, 11)
    INSERT INTO t1 (ID, StatusID) VALUES (3, 12)
    INSERT INTO t1 (ID, StatusID) VALUES (4, 12)
    INSERT INTO t2 (ID) VALUES (1)
    INSERT INTO t2 (ID) VALUES (3)
    INSERT INTO t2 (ID) VALUES (5)
    

    ...そして、次のクエリを実行します:

    /* this returns four rows, but only two will have data 
    from the second table in the second column */
    SELECT t1.ID, t2.ID
    FROM t1 
    LEFT JOIN t2 ON t1.Id = t2.Id 
    
    /* this returns only one row: the one where t2.ID = 1 */
    SELECT t1.ID, t2.ID
    FROM t1 
    LEFT JOIN t2 ON t1.Id = t2.Id 
    WHERE t2.ID = 1 
    
    /* this returns four rows as in the first query, but only one 
    row will have data in the second column: the one where t2.ID = 1 */
    SELECT t1.ID, t2.ID
    FROM t1 
    LEFT JOIN t2 ON t1.Id = t2.Id 
    AND t2.ID = 1 
    

    コメントに示されているように、異なる結果に注意してください。



    1. 制限と大きなオフセットを使用したMySQLクエリは永久に使用されます

    2. MAX(日付)で選択する方法は?

    3. Access2016のデザインビューで単純な選択クエリを作成する方法

    4. EF Function Import は、StoredProc によって返された列を認識しません