2010-03-10 2 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

che non è permesso, anche l'unione dovrebbe avere lo stesso numero di colonne su entrambe le dichiarazioni selezionare – hallie

+0

@hallie:. Beh, il problema principale è che ciò che segue la direttiva sindacale non è affatto una dichiarazione selezionata. – Guffa

risposta

5

È 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 
0

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 
+0

Grazie a tutti ... Ho ottenuto una soluzione da tutte le tue risposte – spj

2

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.

0

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) 
0

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)

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