Как мне решить, когда использовать правые или левые или внутренние объединения или как определить, какая таблица на какой стороне?

Я знаю использование объединений, но иногда я сталкиваюсь с такой ситуацией, когда я не могу решить, какое объединение будет подходящим, левое или правое.

Вот запрос, где я застрял.

    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, то вы также хотите использовать эти данные в том же запросе.

Пожалуйста, обратитесь к следующему изображению:

SQL-соединения

Я думаю, что вы ищете, чтобы сделать 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 не имеет значения, потому что это не ваша настоящая проблема. (Это если я правильно понимаю ваши комментарии)

Другие вопросы по тегам