web-dev-qa-db-ja.com

右結合/左結合または内部結合をいつ使用するか、またはどのテーブルがどちら側にあるかをどのように判断するのですか?

私は結合の使用法を知っていますが、時々、どのjoinが適切か、leftまたはrightを決定できない場合にこのような状況に遭遇します。

ここで私が立ち往生しているクエリです。

    SELECT  count(ImageId) as [IndividualRemaining],
                userMaster.empName AS ID#,
                CONVERT(DATETIME, folderDetails.folderName, 101) AS FolderDate,
                batchDetails.batchName AS Batch#,
                Client=@ClientName,
                TotalInloaded = IsNull(@TotalInloaded,0),
                PendingUnassigned = @PendingUnassigned,
                InloadedAssigned =     IsNull(@TotalAssigned,0),
                TotalProcessed = @TotalProcessed,
                Remaining = @Remaining
        FROM
                batchDetails
                    Left JOIN  folderDetails ON batchDetails.folderId = folderDetails.folderId
                    Left JOIN  imageDetails ON batchDetails.batchId = imageDetails.batchId
                    Left JOIN  userMaster ON imageDetails.assignedToUser = userMaster.userId

        WHERE   folderDetails.ClientId =@ClientID and verifyflag='n'
                and folderDetails.FolderName IN (SELECT convert(VARCHAR,Value) FROM dbo.Split(@Output,','))
                and userMaster.empName <> 'unused'

        GROUP BY userMaster.empName, folderDetails.folderName, batchDetails.batchName

        Order BY folderDetails.Foldername asc
35
user240141

はい、それはあなたがいる状況に依存します。

SQL JOINを使用する理由

Answer:SQL SELECTステートメントを介して複数のテーブルにアクセスする必要がある場合は常にSQL JOINを使用し、JOINedとテーブル。

コードプロジェクト に関するこの元の記事を読むと、非常に役立ちます: SQL結合の視覚的表現

alt text

また、この投稿を確認してください: SQL SERVER –より良いパフォーマンス– LEFT JOINまたはNOT IN?

MySQLのJOINとOUTER JOINの違い で元のものを見つけます。

105
Pranay Rana

2つのセットで:

  • 両方のセットのすべての結果が必要な場合は、完全外部結合を使用します。

  • 両方のセットに表示される結果のみが必要な場合は、内部結合を使用します。

  • セットaのすべての結果が必要な場合は左外部結合を使用しますが、セットbにセットaのレコードの一部に関連するデータがある場合は、同じクエリでもそのデータを使用します。

次の画像を参照してください。

SQL Joins

13

あなたが探しているのは、メインテーブルから開始するLEFT JOINを実行して、結合されたものに有効なデータがあるかどうかに関係なくメインテーブルからすべてのレコードを返すことだと思います(左上の2つの円で示されているようにグラフィック内)

JOINは連続して行われるため、4つのテーブルを結合し、メインテーブルのすべてのレコードが常に必要な場合は、次のようにLEFT JOINを継続する必要があります。

SELECT * FROM main_table
LEFT JOIN sub_table ON main_table.ID = sub_table.main_table_ID
LEFT JOIN sub_sub_table on main_table.ID = sub_sub_table.main_table_ID

Sub_sub_tableをINNER JOINすると、sub_tableでLEFT JOINを実行した場合でも、すぐに結果セットが縮小されます。

LEFT JOINを実行するときは、返されるNULL値を考慮する必要があることに注意してください。 main_tableに結合できるレコードがない場合、LEFT JOINにより、そのフィールドが強制的に表示され、NULLが含まれます。 INNER JOINは、2つの間に有効なリンクがないため、明らかに行を「捨てる」だけです(結合したIDに基づく対応するレコードはありません)

ただし、探している行をフィルターで除外するwhereステートメントがあることに言及しているので、JOINの質問はnull&voidです。これは実際の問題ではないからです。 (これはあなたのコメントを正しく理解している場合です)

5
AcidRaZor