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

Я знаю использование объединений, но иногда я сталкиваюсь с такой ситуацией, когда мне не удается решить, какой из 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.

alt text

Также проверьте это сообщение: SQL SERVER - лучшая производительность - LEFT JOIN или NOT IN?.

Найти оригинал в: Разница между JOIN и OUTER JOIN в MySQL.

Ответ 2

В двух комплектах:

  • Используйте полное внешнее объединение, когда вы хотите получить все результаты из обоих наборов.

  • Используйте внутреннее объединение, когда вам нужны только результаты, которые появляются в обоих наборах.

  • Используйте левое внешнее объединение, когда вы хотите получить все результаты из набора a, но если набор b содержит данные, относящиеся к некоторым из набора записей, вы также хотите использовать эти данные в том же запросе.

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

SQL Joins

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