2010-03-10 3 views
5
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 
+3

это не разрешено, а также объединение должны иметь одинаковое число столбцов на обоих выбранных утверждений – hallie

+0

@hallie:. Ну, главная проблема в том, что следует, что директива union - это вовсе не оператор выбора. – Guffa

ответ

5

Вы можете преобразовать его так:

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 
0

Неверное использование союза. Все таблицы, которые вы объединяете в союзе, должны иметь одинаковые столбцы. Что-то еще:

SELECT A, B, C FROM TUser 

UNION 

SELECT A, B, C FROM TUser WHERE UserId = dataUserId 
+0

Спасибо всем ... Я получил решение от всех ответов u'r – spj

2

Это недопустимый 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 должны быть в том же порядке.

0

Вы можете использовать существует в ИНЕКЕ вместо инструкции IF:

SELECT column_name(s) FROM table_name1 
UNION 
SELECT column_name(s) FROM table_name2 
    WHERE EXISTS (SELECT columns FROM table_name3) 
0

Вы не можете использовать if заявление внутри a 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 

Существует одна небольшая разница при использовании внутреннего соединения, однако. Если вы столкнулись с более чем одной записью из таблицы TUserData, она не будет случайным образом выбрасывать все результаты, кроме одного, как select @dataUserId=..., а вместо этого вернет результат из каждого совпадения.

(Обратите внимание, что объединение не имеет смысла в текущей форме. Когда вы получите все записи из таблицы в первом запросе, все, что вы получите во втором запросе, будет только дублированием, но я полагаю, что вы просто упростили первый запрос, и что это на самом деле не получить все из таблицы)

0
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 
Смежные вопросы