2016-11-23 4 views
2

Как мы делаем LEFT JOIN со старым синтаксисом?Как мы делаем LEFT JOIN со старым синтаксисом?

Предположим, у вас есть таблица User и таблица UserRole, и вы держите идентификатор UserRole в таблице User.

Вот запрос, чтобы получить имена всех пользовательские, а Имена ролей с новыми обозначениями:

SELECT U.Username, US.[Desc] FROM [User] U 
INNER JOIN UserRole US ON U.UserRoleId = US.Id 

А вот старое обозначение:

SELECT U.Username, US.[Desc] FROM [User] U, UserRole US 
WHERE U.UserRoleId = US.Id 

Теперь, давайте предположим, что все пользователи не имеют роли, UserRoleId равен 0 или NULL.

Вот запрос, чтобы получить имена всех пользовательские, а Имена ролей со старыми обозначениями:

SELECT U.Username, US.[Desc] FROM [User] U 
LEFT JOIN UserRole US ON U.UserRoleId = US.Id 

Вопрос: Как мы делаем то же самое со старым синтаксисом, не используя слово JOIN?

+2

Почему ...........? – mellamokb

ответ

4

Операторов *= и =* (в зависимости от того, какой стороны предиката каждого столбца):

SELECT U.Username, US.[Desc] 
FROM [User] U, UserRole US 
WHERE U.UserRoleId *= US.Id 

Это были устаревшие версии SQL Server 2012, хотя с тех пор не существует обратной совместимости для синтаксиса соединения, который был отменен 24 года назад. я понятия не имею, почему вы можете захотеть использовать это, но вот некоторые причины, чтобы поколебать вас от темной стороны:

Bad habits to kick : using old-style JOINs

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

SELECT U.Username, US.[Desc] 
FROM [User] U, UserRole US 
WHERE U.UserRoleId = US.Id 
UNION ALL 
SELECT U.Username, NULL 
FROM [User] U 
WHERE NOT EXISTS (SELECT 1 FROM UserRole US WHERE U.UserRoleId = US.Id); 

Но опять же, зачем, синтаксис LEFT JOIN был введен в ANSI 92, если вы не можете использовать его с базой данных, настало время изменить поставщика базы данных, а не ваш синтаксис.

+0

Я задавался вопросом, почему я никогда не слышал о синтаксисе '(+)' до ... – mellamokb

+0

Большое спасибо, я всегда использовал старые обозначения даже сейчас, однако, поскольку альтернатива выглядит ужасно долго, пришло время измениться. –

+1

Итак, '(+)' не будет работать для SQL-Server? – sagi

3

Используйте PLUS (+) знак:

SELECT U.Username, US.[Desc] FROM [User] U, UserRole US 
WHERE U.UserRoleId = US.Id(+) 

+ должен быть размещен на любой колонке таблицы справа от LEFT JOIN, который появляется в предложении WHERE.

Хотя - это не рекомендуется, эта форма синтаксиса обычно приводит к ошибкам из-за грязный код он создает

Смежные вопросы