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

to nie jest dozwolone, także Unia powinna mieć taką samą liczbę kolumn w obu wybranych sprawozdań – hallie

+0

@hallie. Cóż, głównym problemem jest to, że to, co jest zgodna z dyrektywą związkową, która w ogóle nie jest oświadczeniem wybieranym. – Guffa

Odpowiedz

5

można przekształcić go tak:

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

Niewłaściwe użycie związku. Wszystkie tabele, które wyciągasz razem w związku, muszą mieć te same kolumny. Coś bardziej podobnego:

SELECT A, B, C FROM TUser 

UNION 

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

Dziękuję wszystkim ... Mam rozwiązanie ze wszystkich odpowiedzi u'r – spj

2

To jest nieprawidłowy SQL. Wygląda na to, że próbujesz napisać coś takiego jak funkcja/procedura przechowywana.

ten sposób UNION działa (http://www.w3schools.com/SQL/sql_union.asp):

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

Oba SELECT musi mieć taką samą liczbę kolumn. Kolumny muszą również mieć podobne typy danych. Ponadto kolumny w każdej instrukcji SELECT muszą być w tej samej kolejności.

0

Można użyć istnieje w WHERE zamiast instrukcji IF:

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

nie można używać wewnątrz oświadczenie if tak, jak w union.

Zamiast stosowania if exists można po prostu użyć 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 

Jest jedna mała różnica przy użyciu sprzężenie wewnętrzne, choć. Jeśli zdarzy ci się dopasować więcej niż jeden rekord z tabeli TUserData, to nie wyrzuci on losowo wszystkich wyników z wyjątkiem jednego jako select @dataUserId=..., zamiast tego zwróci wynik z każdego meczu.

(Zwróć uwagę, że związek jest bezcelowy w swojej obecnej formie. Gdy otrzymasz wszystkie rekordy z tabeli w pierwszym zapytaniu, wszystko, co otrzymasz w drugim zapytaniu, będzie tylko duplikatami, ale przypuszczam, że po prostu uprościliśmy pierwsze zapytanie i że w rzeczywistości nie dostać wszystko ze stołu)

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 
Powiązane problemy