Select
查詢顯示缺失年份
我有一個關於通過查詢顯示缺失值的問題。
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 < 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