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
Antwort
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
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
Vielen Dank ... Ich habe eine Lösung von all Ihren Antworten – spj
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.
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)
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)
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
, die nicht erlaubt ist, sollte auch Union gleiche Anzahl von Spalten auf beiden select-Anweisungen – hallie
@hallie hat. Nun, das Hauptproblem ist, dass das, was folgt der Gewerkschaftsrichtlinie ist keine Select-Aussage überhaupt. – Guffa