簡體   English   中英

IF EXISTS語句中的UNION不起作用

[英]UNION inside IF EXISTS statement not working

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

你可以改變它:

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

那是無效的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語句中的列必須具有相同的順序。

工會使用錯誤。 您在聯合中匯總的所有表必須具有相同的列。 更像是:

SELECT A, B, C FROM TUser

UNION

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

您可以在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)

你不能在這樣的union使用if語句。

您可以簡單地使用inner join而不是使用if exists

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=...之外的所有結果,而是返回每個匹配的結果。

(請注意,聯合在當前形式中是沒有意義的。當您從第一個查詢中獲取表中的所有記錄時,您在第二個查詢中獲得的任何內容都只是重復的,但我想您只是簡化了第一個查詢,並且它實際上並沒有從表中得到所有東西。)

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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM