2010-03-10 51 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 2010-03-10 08:01:35

+0

@hallie相同的列数:嗯,主要的问题是什么遵循union指令根本不是选择语句。 – Guffa 2010-03-10 08:28:06

回答

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

谢谢大家......我从你所有的答案中得到了解决方案 – spj 2010-03-10 09:31:50

2

这是无效的SQL。看起来你正在尝试写一些类似于函数/存储过程的东西。

这是工会组织如何运作(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语句中的列必须以相同的顺序排列。

0

你可以使用存在于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

不能内部使用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=...之外的所有结果,而是会返回每个匹配的结果。 (注意联合在当前表单中是毫无意义的,当你从第一个查询中的表中获取所有记录时,在第二个查询中得到的任何内容都将只是重复的,但我想你只是简化了第一个查询,它并没有真正得到一切从表)

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