私は結合の使用法を知っていますが、時々、どの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
はい、それはあなたがいる状況に依存します。
SQL JOINを使用する理由
Answer:SQL SELECTステートメントを介して複数のテーブルにアクセスする必要がある場合は常にSQL JOINを使用し、JOINedとテーブル。
コードプロジェクト に関するこの元の記事を読むと、非常に役立ちます: SQL結合の視覚的表現 。
また、この投稿を確認してください: SQL SERVER –より良いパフォーマンス– LEFT JOINまたはNOT IN? 。
MySQLのJOINとOUTER JOINの違い で元のものを見つけます。
あなたが探しているのは、メインテーブルから開始する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です。これは実際の問題ではないからです。 (これはあなたのコメントを正しく理解している場合です)