Tengo una unión en la misma tabla [MyTable] para poder seleccionar ciertos valores como los 5 principales, cuya lógica estoy excluyendo aquí para simplificar la pregunta (espero):

La primera tabla I alias como tbl1: ¿puedo hacer referencia a este alias de alguna manera después de la declaración UNION para poder excluir los resultados?

Lo intenté así, pero no reconoce tbl1

SELECT top 5 tbl1.Id, tbl1.Description, 'first'
  FROM (
           -- query [MyTable] joined with others to get particular result set
       ) as tbl1

UNION

SELECT tbl2.Id, tbl2.Description, 'second'
  FROM [MyTable] as tbl2 WHERE tbl2.Id NOT IN
     (SELECT Id FROM tbl1)

¿O solo tengo que rehacer la primera consulta en la segunda mitad para que esos Id se excluyan?

Estoy usando SQL Server 2012 para esto.

1
jamheadart 1 may. 2020 a las 13:07

2 respuestas

La mejor respuesta

Utilice una CTE:

WITH cte AS (
  SELECT top 5 tbl1.Id, tbl1.Description, 'first'
  FROM (
           -- query [MyTable] joined with others to get particular result set
  ) as tbl1
)
SELECT * FROM cte
UNION ALL
SELECT tbl2.Id, tbl2.Description, 'second'
FROM [MyTable] as tbl2 WHERE tbl2.Id NOT IN (SELECT Id FROM cte)
1
forpas 1 may. 2020 a las 10:11

También puede usar una tabla temporal para el mismo propósito según sus requisitos. Vea la diferencia aquí.

SELECT TOP 5 tbl1.Id, tbl1.Description, 'first' INTO #tbl1
FROM (
           -- query [MyTable] joined with others to get particular result set
) 

SELECT * FROM #tbl1
UNION ALL
SELECT tbl2.Id, tbl2.Description, 'second'
FROM [MyTable] as tbl2 WHERE tbl2.Id NOT IN (SELECT Id FROM #tbl1)
0
DattatrayR 1 may. 2020 a las 12:04