Я знаю использование соединений, но иногда я сталкиваюсь с такой ситуацией, когда я не могу решить, какое соединение подойдет, левое или правое.
Вот запрос, где я застреваю.
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?
Ответ : Используйте SQL JOIN всякий раз, когда необходимо получить доступ к нескольким таблицам через SQL SELECT, и результаты не должны возвращаться, если между JOINed таблицами нет совпадения.
Чтение этой исходной статьи о The Code Project вам очень поможет: Визуальное представление соединений SQL .
Также проверьте это сообщение: SQL-СЕРВЕР - Повышение производительности - СЛЕВА ПРИСОЕДИНЯТЬСЯ или НЕ ВХОДИТЬ? .
Оригинал можно найти по адресу: Разница между СОЕДИНЕНИЕМ и ВНЕШНИМ СОЕДИНЕНИЕМ в MySQL .
Я думаю, что вы ищете, чтобы сделать 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
под_таблицу, это немедленно уменьшит ваш набор результатов, даже если вы сделали LEFT JOIN
на под_таблице.
Помните, что при выполнении LEFT JOIN
, вам нужно учитывать, что возвращаются NULL
значения. Потому что если ни одна запись не может быть объединена с основной_таблицей, LEFT JOIN
заставит это поле появиться независимо и будет содержать NULL. INNER JOIN
, очевидно, просто "выбросит" строку, потому что между ними нет действительной связи (нет соответствующей записи на основе ID, которые вы объединили)
Однако вы упомянули, что у вас есть оператор where, который отфильтровывает строки, которые вы ищете, поэтому ваш вопрос о JOIN'ах недействителен, потому что это не ваша настоящая проблема. (Это если я правильно понял ваши комментарии)