Select

查詢顯示缺失年份

  • January 6, 2020

我有一個關於通過查詢顯示缺失值的問題。

Top2000給定以欄位Artist, Title, Ranking,命名的表Year,以下查詢…

Select * 
from Top2000 
order by Artist, Title, Year

…顯示類似…

Abba | Dancing Queen       | 1720 | 2015
Abba | Dancing Queen       | 1340 | 2016
Abba | Dancing Queen       | 1970 | 2019
Abba | Money, Money, Money | 870  | 2016
Abba | Money, Money, Money | 502  | 2017

…而下一個查詢…

select distinct Year 
from Top2000 
order by Year

…給出的結果…

2015
2016
2017
2018
2019

我想用以下輸出創建一個查詢

Abba | Dancing Queen       | 2017
Abba | Dancing Queen       | 2018
Abba | Money, Money, Money | 2015
Abba | Money, Money, Money | 2018
Abba | Money, Money, Money | 2019

我該如何編寫這樣的查詢?

感謝您的澄清 - 不幸的是 MS-Access(和 SQL-Server 提出了一些限制..

子查詢返回超過 1 個值。當子查詢跟隨 =、!=、<、<=、>、>= 或子查詢用作表達式時,這是不允許的。

所以我只有一個“一半”的解決方案給你

SELECT DISTINCT Year 
FROM Top2000 AS T3
WHERE Year NOT IN (
 SELECT Distinct Year FROM Top2000 AS T1 
  WHERE T1.Artist='Abba' AND T1.Title='Money, Money, Money'
)

有了這個,您必須首先獲得所有唯一藝術家-標題對的清理列表 - 然後使用填寫的藝術家和標題呼叫查詢,而不是我從您的範例數據中使用的範例。

問題是數據庫更適合為您提供有關它們實際包含的數據的結果,而不是它們不“知道”的數據

像這樣的東西會起作用(我在@tbl 中使用虛擬數據而不是你的 Top2000 表):

--Dummy table
declare @tbl table(a varchar(max) not null,b varchar(max) not null,c integer not null,d integer not null)

--Dummy data
insert into @tbl(a,b,c,d) values('Abba','Dancing Queen',1720,2015)
insert into @tbl(a,b,c,d) values('Abba','Dancing Queen',1340,2016)
insert into @tbl(a,b,c,d) values('Abba','Dancing Queen',1970,2019)
insert into @tbl(a,b,c,d) values('Abba','Money, Money, Money',870,2016)
insert into @tbl(a,b,c,d) values('Abba','Money, Money, Money',502,2017)

--Start year( you need to know the first year in the list)
declare @minYear integer
set @minYear = (select MIN(d) from @tbl)

--Table to hold the result
   declare @res table(a varchar(max) not null,b varchar(max) not null,d integer not null)

while @minYear &lt; YEAR(dateadd(year,1,sysdatetime()))
   begin
   insert into @res(a,b,d)
   select a,b,@minYear
   from @tbl y
   where y.a not in( select X.a from @tbl x where x.b = y.b and x.d = @minYear )
   group by a,b

   set @minYear = @minYear +1
   end

select * from @res

引用自:https://dba.stackexchange.com/questions/256751