IF EXISTS语句中的UNION不起作用

时间:2010-03-10 07:57:28

标签: sql union

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

6 个答案:

答案 0 :(得分: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

答案 1 :(得分: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语句必须具有相同的列数。列还必须具有类似的数据类型。此外,每个SELECT语句中的列必须具有相同的顺序。

答案 2 :(得分:0)

错误使用union。您在联合中汇总的所有表必须具有相同的列。更像是:

SELECT A, B, C FROM TUser

UNION

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

答案 3 :(得分:0)

您可以在WHERE子句中使用exists而不是IF语句:

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

答案 4 :(得分:0)

您不能在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

但是,使用内连接时有一个小的区别。如果您碰巧匹配TUserData表中的多个记录,它将不会随机丢弃除select @dataUserId=...之外的所有结果,而是返回每个匹配的结果。

(请注意,联合在当前形式中是没有意义的。当您从第一个查询中的表中获取所有记录时,您在第二个查询中获得的任何内容将只是重复,但我想您只是简化了第一个查询查询,它实际上并没有从表中获取所有内容。)

答案 5 :(得分: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