SELECT A, B, C FROM TUser
UNION
IF EXISTS(SELECT dataUserId FROM TUserData WHERE DataId = @dataId AND UserId = @userId)
BEGIN
SELECT @dataUserId = dataUserId FROM TUserData WHERE DataId = @dataId AND UserId = @userId
SELECT A, B, C FROM TUser WHERE UserId = dataUserId
END
Вы можете преобразовать это следующим образом:
SELECT @dataUserId = dataUserId FROM TUserData
WHERE DataId = @dataId AND UserId = @userId
IF (@dataUserId IS NOT NULL)
BEGIN
SELECT A, B, C FROM TUser
UNION
SELECT A, B, C FROM TUser WHERE UserId = @dataUserId
END
ELSE
SELECT A, B, C FROM TUser
SELECT A, B, C
FROM TUser
UNION
SELECT u.A, u.B, u.C
FROM TUser AS u
JOIN TUserData AS d ON u.UserId = d.dataUserId
WHERE d.UserId = @userId
AND d.DataId = @dataId
Неправильное использование объединения. Все таблицы, которые вы объединяете в союз, должны иметь одинаковые столбцы. Что-то вроде:
SELECT A, B, C FROM TUser
UNION
SELECT A, B, C FROM TUser WHERE UserId = dataUserId
Это недопустимый SQL. Похоже, вы пытаетесь написать что-то вроде функции / хранимой процедуры.
Вот как работает UNION ( http://www.w3schools.com/SQL/sql_union.asp ):
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
Оба оператора SELECT должны иметь одинаковое количество столбцов. Столбцы также должны иметь похожие типы данных. Кроме того, столбцы в каждом операторе SELECT должны быть в одинаковом порядке.
Вы можете использовать exists в предложении WHERE вместо оператора IF :
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
WHERE EXISTS (SELECT columns FROM table_name3)
Вы не можете использовать оператор if
внутри union
, как это.
Вместо if exists
вы можете просто использовать inner join
:
select A, B, C from TUser
union
select u.A, u.B, u.C from TUser u
inner join TUserData t on t.dataUserId = u.UserId
where t.DataId = @dataId and t.UserId = @userId
Однако при использовании inner join есть одно небольшое отличие. Если вы сопоставите более одной записи из таблицы TUserData, это не приведет к случайному отбрасыванию всех результатов, кроме одного, как в случае select @dataUserId=....
, а вернет результат из каждого совпадения.
(Обратите внимание, что объединение бессмысленно в его текущей форме. Поскольку в первом запросе вы получаете все записи из таблицы, все, что вы получите во втором запросе, будет только дубликатами, но я полагаю, что вы просто упростили первый запрос и что он на самом деле не получает все из таблицы)
.