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

, die nicht erlaubt ist, sollte auch Union gleiche Anzahl von Spalten auf beiden select-Anweisungen – hallie

+0

@hallie hat. Nun, das Hauptproblem ist, dass das, was folgt der Gewerkschaftsrichtlinie ist keine Select-Aussage überhaupt. – Guffa

Antwort

5

Sie können es so verwandeln:

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

Falsche Verwendung der Union. Alle Tabellen, die Sie in einer Union zusammenziehen, müssen die gleichen Spalten haben. Etwas mehr wie:

SELECT A, B, C FROM TUser 

UNION 

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

Vielen Dank ... Ich habe eine Lösung von all Ihren Antworten – spj

2

Das ist ungültige SQL. Es scheint, dass Sie versuchen, etwas wie eine Funktion/gespeicherte Prozedur zu schreiben. Diese

ist wie UNION arbeitet (http://www.w3schools.com/SQL/sql_union.asp):

SELECT column_name(s) FROM table_name1 
UNION 
SELECT column_name(s) FROM table_name2 

Beide SELECT-Anweisungen die gleiche Anzahl von Spalten haben. Die Spalten müssen auch ähnliche Datentypen haben. Außerdem müssen die Spalten in jeder SELECT-Anweisung in derselben Reihenfolge stehen.

0

Sie existiert in verwenden könnte WHERE-Klausel anstelle der IF-Anweisung:

SELECT column_name(s) FROM table_name1 
UNION 
SELECT column_name(s) FROM table_name2 
    WHERE EXISTS (SELECT columns FROM table_name3) 
0

Sie können keine if Anweisung innerhalb verwenden a union so.

Statt mit einem if exists Sie können einfach ein inner join verwenden:

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 

Es gibt einen kleinen Unterschied bei der Verwendung eine innere Verknüpfung, though. Wenn Sie mehr als einen Datensatz aus der TUserData-Tabelle zuordnen, werden nicht alle Ergebnisse mit Ausnahme von einem wie dem select @dataUserId=..., sondern stattdessen das Ergebnis aus jedem Treffer zurückgegeben.

(Beachten Sie, dass die Union in ihrer aktuellen Form sinnlos ist. Wenn Sie alle Datensätze aus der Tabelle in der ersten Abfrage abrufen, werden nur die Duplikate in der zweiten Abfrage angezeigt erste Abfrage und dass es tatsächlich nicht alles vom Tisch bekommen)

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