Как я могу решить, когда использовать правильные объединения/левые соединения или внутренние соединения или как определить, какая таблица находится с какой стороны?
Я знаю использование объединений, но иногда я сталкиваюсь с такой ситуацией, когда мне не удается решить, какой из join подходит, слева или справа.
Вот запрос, в котором я застрял.
SELECT count(ImageId) as [IndividualRemaining],
userMaster.empName AS ID#,
CONVERT(DATETIME, folderDetails.folderName, 101) AS FolderDate,
batchDetails.batchName AS Batch#,
[email protected],
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 [email protected] 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
Ответы
Ответ 1
Да, это зависит от ситуации, в которой вы находитесь.
Зачем использовать SQL JOIN?
Ответ. Используйте SQL JOIN, когда нужно обращаться к нескольким таблицам с помощью инструкции SQL SELECT, и результаты не должны возвращаться, если между таблицами JOINed нет соответствия.
Чтение этой оригинальной статьи на Проект Code поможет вам много: Визуальное представление соединений SQL.
Также проверьте это сообщение: SQL SERVER - лучшая производительность - LEFT JOIN или NOT IN?.
Найти оригинал в: Разница между JOIN и OUTER JOIN в MySQL.
Ответ 2
В двух комплектах:
-
Используйте полное внешнее объединение, когда вы хотите получить все результаты из обоих наборов.
-
Используйте внутреннее объединение, когда вам нужны только результаты, которые появляются в обоих наборах.
-
Используйте левое внешнее объединение, когда вы хотите получить все результаты из набора a, но если набор b содержит данные, относящиеся к некоторым из набора записей, вы также хотите использовать эти данные в том же запросе.
Пожалуйста, обратитесь к следующему изображению:
Ответ 3
Я думаю, что вы хотите сделать 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, он немедленно уменьшит ваш результат, даже если вы сделали LEFT JOIN
на sub_table.
Помните, что при выполнении LEFT JOIN
вам нужно учитывать возвращаемые значения NULL
. Поскольку если никакая запись не может быть соединена с main_table, a LEFT JOIN
заставляет это поле появляться независимо и будет содержать NULL. INNER JOIN
, очевидно, просто "выкинет" строку вместо этого, потому что между ними нет действующей ссылки (нет соответствующей записи на основе идентификатора, к которому вы присоединились)
Однако вы упомянули, что у вас есть оператор where, который отфильтровывает строки, которые вы ищете, поэтому ваш вопрос в JOIN недействителен, потому что это не ваша настоящая проблема. (Это, если я правильно понимаю ваши комментарии)