Как мне решить, когда использовать правые или левые или внутренние соединения или как определить, какая таблица на какой стороне? - PullRequest
35 голосов
/ 22 июля 2010

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

Вот запрос, в котором я застрял.

    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 ]

105 голосов
/ 22 июля 2010

Да, это зависит от ситуации, в которой вы находитесь.

Зачем использовать SQL JOIN?

Ответ : Используйте SQL JOIN всякий раз, когда необходимо обратиться к нескольким таблицам с помощью оператора SQL SELECT, и результаты не должны возвращаться, если между таблицами JOINed нет совпадений.

Чтение этой оригинальной статьи о Проект кода вам очень поможет: Визуальное представление соединений SQL .

alt text

Также проверьте этот пост: SQL SERVER - Лучшая производительность - СЛЕДУЮЩИЙ или НЕ ВХОД? .

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

12 голосов
/ 31 марта 2014

В двух наборах:

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

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

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

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

SQL Joins

5 голосов
/ 22 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...