Как мне решить, когда использовать правые или левые или внутренние объединения или как определить, какая таблица на какой стороне?
Я знаю использование объединений, но иногда я сталкиваюсь с такой ситуацией, когда я не могу решить, какое объединение будет подходящим, левое или правое.
Вот запрос, где я застрял.
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
3 ответа
Да, это зависит от ситуации, в которой вы находитесь.
Зачем использовать SQL JOIN?
Ответ: Используйте SQL JOIN всякий раз, когда необходимо обратиться к нескольким таблицам с помощью оператора SQL SELECT, и результаты не должны возвращаться, если между таблицами JOINed нет совпадений.
Чтение этой оригинальной статьи о проекте Code очень поможет вам: визуальное представление соединений SQL.
Также проверьте этот пост: СЕРВЕР SQL - Лучшая производительность - СЛЕДУЮЩИЙ или НЕ ВХОД?,
Найдите оригинал по адресу: Разница между JOIN и OUTER JOIN в MySQL.
В двух наборах:
Используйте полное внешнее объединение, когда вы хотите получить все результаты из обоих наборов.
Используйте внутреннее объединение, когда хотите, чтобы результаты отображались в обоих наборах.
Используйте левое внешнее объединение, когда вы хотите получить все результаты из набора a, но если набор b содержит данные, относящиеся к некоторым записям набора a, то вы также хотите использовать эти данные в том же запросе.
Пожалуйста, обратитесь к следующему изображению:
Я думаю, что вы ищете, чтобы сделать LEFT JOIN
начиная с основной таблицы, чтобы вернуть все записи из основной таблицы, независимо от того, имеют ли они действительные данные в соединенных (как показано 2 верхними левыми кружками на рисунке)
СОЕДИНЕНИЕ происходит последовательно, поэтому, если у вас есть 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, он немедленно сократит ваш набор результатов, даже если вы сделали LEFT JOIN
на sub_table.
Помните, когда делаете LEFT JOIN
нужно учесть NULL
возвращаемые значения. Потому что, если ни одна запись не может быть объединена с main_table, LEFT JOIN
заставляет это поле появляться независимо и будет содержать значение NULL. INNER JOIN
очевидно, вместо этого просто "выбросит" строку, потому что между ними нет действительной связи (нет соответствующей записи на основе идентификаторов, к которым вы присоединились)
Тем не менее, вы упоминаете, что у вас есть оператор where, который отфильтровывает искомые строки, поэтому ваш вопрос о JOIN не имеет значения, потому что это не ваша настоящая проблема. (Это если я правильно понимаю ваши комментарии)