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

eso no está permitido, al mismo tiempo unión debe tener el mismo número de columnas en las dos instrucciones select – hallie

+0

@hallie:. Bueno, el problema principal es que lo sigue la directiva sindical no es una declaración selecta en absoluto. – Guffa

Respuesta

5

Puede transformarla así:

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 incorrecto de la unión. Todas las tablas que estás juntando en una unión deben tener las mismas columnas. Algo más como:

SELECT A, B, C FROM TUser 

UNION 

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

Gracias a todos ... Tengo una solución de todas las respuestas – spj

2

SQL no válido. Parece que estás intentando escribir algo como una función/procedimiento almacenado.

Así es como funciona UNIÓN (http://www.w3schools.com/SQL/sql_union.asp):

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

Ambas sentencias SELECT deben tener el mismo número de columnas. Las columnas también deben tener tipos de datos similares. Además, las columnas en cada declaración SELECT deben estar en el mismo orden.

0

Usted podría utilizar existe en la cláusula WHERE en lugar de la instrucción IF:

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

Usted no puede utilizar una sentencia dentro if un union así.

lugar de utilizar un if exists puede simplemente usar 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 

Hay una pequeña diferencia cuando se utiliza una combinación interna, sin embargo. Si coincidiera con más de un registro de la tabla TUserData, no descartará aleatoriamente todos los resultados excepto uno como select @dataUserId=..., sino que devolverá el resultado de cada coincidencia.

(Tenga en cuenta que la unión no tiene sentido en su forma actual. Como obtiene todos los registros de la tabla en la primera consulta, todo lo que obtenga en la segunda consulta solo será duplicado, pero supongo que simplificó el primera consulta y que en realidad no conseguir todo de la mesa)

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 
Cuestiones relacionadas