SQL Server: How to use UNION with two queries that BOTH have a WHERE clause?

26
задан Tomas Kubes 28 October 2016 в 20:31
поделиться

2 ответа

declare @T1 table(ID int, ReceivedDate datetime, [type] varchar(10))
declare @T2 table(ID int, ReceivedDate datetime, [type] varchar(10))

insert into @T1 values(1, '20010101', '1')
insert into @T1 values(2, '20010102', '1')
insert into @T1 values(3, '20010103', '1')

insert into @T2 values(10, '20010101', '2')
insert into @T2 values(20, '20010102', '2')
insert into @T2 values(30, '20010103', '2')

;with cte1 as
(
  select *,
    row_number() over(order by ReceivedDate desc) as rn
  from @T1
  where [type] = '1'
),
cte2 as
(
  select *,
    row_number() over(order by ReceivedDate desc) as rn
  from @T2
  where [type] = '2'
)
select *
from cte1
where rn <= 2
union all
select *
from cte2
where rn <= 2
5
ответ дан 28 November 2019 в 06:38
поделиться

Обратите внимание, что каждый оператор SELECT в UNION должен иметь одинаковое количество столбцов. Столбцы также должны иметь похожие типы данных. Кроме того, столбцы в каждом операторе SELECT должны быть в том же порядке. Вы выбираете

t1.ID, t2.ReceivedDate из таблицы t1

union

t2.ID из таблицы t2

, что неверно.

, поэтому вы должны написать

t1.ID, t1.ReceivedDate из таблицы t1 union t2.ID, t2.ReceivedDate из таблицы t1

здесь можно использовать подзапрос

 SELECT tbl1.ID, tbl1.ReceivedDate FROM
      (select top 2 t1.ID, t1.ReceivedDate
      from tbl1 t1
      where t1.ItemType = 'TYPE_1'
      order by ReceivedDate desc
      ) tbl1 
 union
    SELECT tbl2.ID, tbl2.ReceivedDate FROM
     (select top 2 t2.ID, t2.ReceivedDate
      from tbl2 t2
      where t2.ItemType = 'TYPE_2'
      order by t2.ReceivedDate desc
     ) tbl2 

, поэтому он будет возвращать только разные значения по умолчанию из обеих таблиц.

0
ответ дан 28 November 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: