ОБЪЕДИНЕНИЕ внутри, ЕСЛИ оператор EXISTS, не работающий

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
5
задан spj 10 March 2010 в 07:57
поделиться

6 ответов

Вы можете преобразовать это следующим образом:

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
5
ответ дан 14 December 2019 в 08:48
поделиться
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 
0
ответ дан 14 December 2019 в 08:48
поделиться

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

SELECT A, B, C FROM TUser

UNION

SELECT A, B, C FROM TUser WHERE UserId = dataUserId
0
ответ дан 14 December 2019 в 08:48
поделиться

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

2
ответ дан 14 December 2019 в 08:48
поделиться

Вы можете использовать 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)
0
ответ дан 14 December 2019 в 08:48
поделиться

Вы не можете использовать оператор 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=.... , а вернет результат из каждого совпадения.

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

.
0
ответ дан 14 December 2019 в 08:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: