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
risposta
È possibile trasformare in quel modo:
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
Uso errato di unione. Tutte le tabelle che stai riunendo in un sindacato devono avere le stesse colonne. Qualcosa di più simile:
SELECT A, B, C FROM TUser
UNION
SELECT A, B, C FROM TUser WHERE UserId = dataUserId
Grazie a tutti ... Ho ottenuto una soluzione da tutte le tue risposte – spj
SQL non valido. Sembra che tu stia cercando di scrivere qualcosa come una funzione/stored procedure.
Questo è come funziona UNION (http://www.w3schools.com/SQL/sql_union.asp):
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
Entrambe le istruzioni SELECT devono avere lo stesso numero di colonne. Le colonne devono avere anche tipi di dati simili. Inoltre, le colonne in ogni istruzione SELECT devono essere nello stesso ordine.
Si potrebbe utilizzare esiste nella clausola WHERE anziché l'istruzione IF:
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
WHERE EXISTS (SELECT columns FROM table_name3)
Non è possibile utilizzare un if
istruzione all'interno un union
così.
Invece di usare un if exists
si può semplicemente utilizzare un 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
C'è una piccola differenza quando si utilizza un join interno, però. Se ti capita di abbinare più di un record dalla tabella TUserData, non casualmente butta via tutti i risultati tranne uno come lo sarebbe il select @dataUserId=...
, se invece restituirà il risultato di ogni partita.
(Si noti che l'unione è inutile nella sua forma attuale. Come si ottiene tutti i record dalla tabella nella prima query, tutto ciò che si ottiene nella seconda query sarà solo duplicati, ma suppongo che hai semplicemente semplificato il prima query e che in realtà non ottenere tutto dalla tabella)
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
che non è permesso, anche l'unione dovrebbe avere lo stesso numero di colonne su entrambe le dichiarazioni selezionare – hallie
@hallie:. Beh, il problema principale è che ciò che segue la direttiva sindacale non è affatto una dichiarazione selezionata. – Guffa