2012-03-02 14 views
5

Intentaré hacer que mi pregunta suene lo menos confusa posible. Me disculpo de antemano por cualquier error de redacción cuando intento formular mi pregunta lo mejor que puedo:¿Complemento de una unión SQL? Se necesita ayuda de T-SQL

Uso de T-SQL Necesito escribir una declaración de combinación que me proporcione todos los resultados que coincidan en la tabla A y la tabla B

Y (!)

otra instrucción de combinación (o una continuación de la primera unión) que devuelve todos los resultados de la tabla a que no tenían un partido en el cuadro B, pero en este segundo conjunto de resultados Necesito tener una de las columnas establecidas en "N/A" para identificar los registros que no coinciden.

En otras palabras, necesito algo que devuelva todo en la tabla A, pero también identifique las filas que no coinciden en B. Esa información se utiliza en un informe.

Esto es lo que tengo hasta ahora:

tengo la primera parte hecho:

LEFT OUTER JOIN dbo.chart B 
ON B.UserName = A.user_name 

que me pone los registros coincidentes y sólo los registros coincidentes

He intentado añadir este segundo unirse:

JOIN dbo.chart 
ON NOT EXISTS (select * from B.UserName = A.user_name) 

Esperando que me daría los registros no coincidentes (yo estaba planea usar REEMPLAZAR en la columna de interés para etiquetar esa columna "N/A"), pero hay algo claramente erróneo en mi sintaxis, ya que genera excepciones.

Mi pregunta es qué necesito cambiar para obtener los resultados que necesita. Sé que necesito tener al menos una unión ya que tengo otra parte de la consulta para trabajar. Simplemente no sé si necesito que esa unión devuelva ambos conjuntos de datos. De hecho, necesito una segunda para los registros que no coinciden.

Espero que esto no sea demasiado confuso. Cualquier ayuda sería muy apreciada.

¡Gracias!

Actualización: Simplemente me gustaría enfatizar que el motivo por el que consideré usar una segunda unión en lugar de obtener todos los resultados a la vez es porque necesito identificar y etiquetar correctamente las filas que no coinciden con todo lo que Regreso.

+0

'join' externa izquierda deben darle lo que quiere. Todas las filas de A y unidas a B donde hay una coincidencia. ¿Tiene una condición WHERE en alguna columna de la tabla B? Si lo hace, eso haría que la unión externa fuera una unión interna y necesita mover la verificación contra las columnas en la tabla B a la cláusula join. –

+0

Gracias por su respuesta, Mikael. Lo más importante que quiero lograr (y la razón principal por la que consideré usar una segunda combinación) es poder identificar y etiquetar qué filas coinciden y cuáles no. – user1179071

+0

No necesita una unión adicional para eso. Use 'coalesce' como lo sugiere Mark en un comentario a la respuesta de Dems. –

Respuesta

1

muestra:

declare @TableA table 
(
    TableAID int, 
    TableAName varchar(10) 
) 

declare @TableB table 
(
    TableBID int, 
    TableBName varchar(10), 
    TableAID int 
) 

insert into @TableA values 
(1, 'A 1'), 
(2, 'A 2'), 
(3, 'A 3') 

insert into @TableB values 
(1, 'B 1', 1), 
(2, 'B 2', 2) 

N/A en lugar de TableBName:

select A.TableAName, 
     coalesce(B.TableBName, 'N/A') as TableBName 
from @TableA as A 
    left outer join @TableB as B 
    on A.TableAID = B.TableAID 

Resultado:

TableAName TableBName 
---------- ---------- 
A 1  B 1 
A 2  B 2 
A 3  N/A 

columna adicional para N/A:

select A.TableAName, 
     B.TableBName, 
     case when B.TableBID is null 
     then 'N/A' 
     else '' 
     end as TableBPresent 
from @TableA as A 
    left outer join @TableB as B 
    on A.TableAID = B.TableAID  

Resultado:

TableAName TableBName TableBPresent 
---------- ---------- ------------- 
A 1  B 1   
A 2  B 2   
A 3  NULL  N/A 
+0

Eso es muy útil. ¡Gracias! – user1179071

+0

He aquí una corrección para que sea perfecto: 'Select A.TableAName, se unen (B.TableBName, 'N ​​/ A') como TableBName de @TableA como A externa izquierda seleccione TableID de B en A. TableAID = B.TableAID' – user1179071

+0

@ user1179071 su consulta no es válida –

0

Trate de usar una unión:

select A.id, b.id, b.desc from tablea A LEFT OUTER JOIN dbo.chart B 
ON B.UserName = A.user_name 

UNION 

select a.id, 0, 'N/A' from tablea where NOT EXISTS (select * from B.UserName = A.user_name) 
+0

Necesita arreglar su NO EXISTE. Seleccione * de B donde ... Y debería ser una unión interna. – Phil

+0

Gracias. Probando todo lo que fue sugerido. – user1179071

3

No estoy seguro de a dónde va con la segunda unión. LEFT JOIN parece hacer todo lo que quiere ...

DECLARE @tableA TABLE (a_id INT) INSERT INTO @tableA VALUES (1), (2), (3), (4) 
DECLARE @tableB TABLE (b_id INT) INSERT INTO @tableB VALUES  (2), (3) 

SELECT * FROM @tableA AS A LEFT JOIN @tableB AS B on A.a_id = b.b_id 

a_id | b_id 
------+------ 
    1 | NULL 
    2 | 2 
    3 | 3 
    4 | NULL 

A menos que decir que en realidad estás unirse a 3 mesas juntos?datos

DECLARE @org TABLE (o_io INT) INSERT INTO @org VALUE  (2), (3), (4) 
DECLARE @tableA TABLE (a_id INT) INSERT INTO @tableA VALUES (1), (2), (3), (4) 
DECLARE @tableB TABLE (b_id INT) INSERT INTO @tableB VALUES  (2), (3) 

SELECT 
    * 
FROM 
    @org  AS O 
INNER JOIN 
    @tableA  AS A 
    ON O.o_id = A.a_id 
LEFT JOIN 
    @tableB  AS B 
    ON A.a_id = b.b_id 

o_id | a_id | b_id 
------+------+------ 
    2 | 2 | 2 
    3 | 3 | 3 
    4 | 4 | NULL 
+1

+1 Agregue un 'coalesce (B.UserName, 'N ​​/ A')' (u otra columna tableB apropiada) a la cláusula de selección para cumplir los requisitos del OP para registros "N/A" sin registro correspondiente tableBB. –

+0

Demócratas, gracias por su respuesta. En realidad, son solo dos tablas con las que estoy trabajando (dbo.chart y dbo.orgchart son una y la misma). Corregiré mi tipo en la pregunta. – user1179071

+0

Mark, probaré su sugerencia en combinación con lo que escribió Dems. ¡Gracias! – user1179071

Cuestiones relacionadas