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
答案 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