我知道联接的用法,但有时候当我无法确定哪个加入是合适的,左或右时,我会遇到这种情况。
这是我被困的查询。
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
答案 0 :(得分:101)
是的,这取决于你所处的情况。
为什么要使用SQL JOIN?
答案:每当必须通过SQL SELECT语句访问多个表时使用SQL JOIN,如果JOINed表之间没有匹配项,则不应返回任何结果。
在The Code Project上阅读这篇原创文章会对您有所帮助:Visual Representation of SQL Joins。
同时查看此帖子:SQL SERVER – Better Performance – LEFT JOIN or NOT IN?。
答案 1 :(得分:11)
两套:
如果需要两组中的所有结果,请使用完全外部联接。
如果只想显示两者中的结果,请使用内部联接 集。
如果希望设置a的所有结果,请使用左外连接,但是 如果设置b具有与某些设置的记录相关的数据,那么您也是 我也希望在同一个查询中使用这些数据。
请参考下图:
答案 2 :(得分:5)
我认为您正在寻找的是从主表开始执行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
如果您INNER JOIN
sub_sub_table,即使您在sub_table上执行了LEFT JOIN
,它也会立即缩小您的结果集。
请记住,在执行LEFT JOIN
时,您需要考虑返回的NULL
值。因为如果没有记录可以与main_table连接,LEFT JOIN
会强制该字段出现,并且将包含NULL。 INNER JOIN
显然只会“抛弃”该行,因为两者之间没有有效的链接(根据您加入的ID没有相应的记录)
但是,你提到你有一个where语句来过滤你正在寻找的行,所以关于JOIN的问题是null&amp;因为这不是你真正的问题。 (如果我理解你的评论,那就是这样)