有朋友問,
關於電影記錄的查詢SQL,突然不知道如何下手,給個提示參考一下啊,謝謝。
比如,table_mv 表記錄電影的基礎信息,包括三個字段 名稱,鏈接,歸類
變形金剛第一部 電影鏈接1 歸類(變形金剛)。
變形金剛第二部 電影鏈接2 歸類(變形金剛)。
變形金剛第三部 電影鏈接3 歸類(變形金剛)。
終結者 電影鏈接A 歸類。
在查詢時規則如下,如果歸類為空,則正常,如果歸類有值,則匯總,
名稱為歸類名稱,連接默認為第一個,
查詢結果為:
變形金剛 電影鏈接1 歸類(變形金剛)。
終結者 電影鏈接A 歸類。
---------------------------------
當時初略的想了想,可以用分組取出來,但寫了下又不行,於是按照需求,創建一個表並且插入數據來測試:
CREATE TABLE MovieInfo ( Name varchar(50) not null, Link varchar(250) not null, MovieType varchar(20) ) GO INSERT INTO MovieInfo VALUES ('變形金剛第一部','電影鏈接1','變形金剛'); INSERT INTO MovieInfo VALUES ('變形金剛第二部','電影鏈接2','變形金剛'); INSERT INTO MovieInfo VALUES ('變形金剛第三部','電影鏈接3','變形金剛'); INSERT INTO MovieInfo VALUES ('終結者','電影鏈接A',NULL); INSERT INTO MovieInfo VALUES ('英雄','電影鏈接A1',NULL); INSERT INTO MovieInfo VALUES ('007第一部','電影鏈接11','007'); INSERT INTO MovieInfo VALUES ('007第二部','電影鏈接12','007'); INSERT INTO MovieInfo VALUES ('007第三部','電影鏈接13','007'); GO SELECT * FROM MovieInfo;
先寫一個分組並求分組后的記錄大於1的查詢:
select MovieType from MovieInfo where MovieType is not null group by MovieType having count(*) >1
結果是:
MovieType 007 變形金剛
根據這個查詢可以進一步取到對應的名字:
select top 1 MovieType, Name from MovieInfo where MovieType in ( select MovieType from MovieInfo where MovieType is not null group by MovieType having count(*) >1 ) group by MovieType,Name
無奈結果不是預期的那樣,只有1條記錄:
MovieType Name
007 007第二部
在同事的指導下,說ROW_NUMBER() 可以在給記錄編號的同時指定分組,然后我們取分組中編號為1的記錄即可,先來分組編號,看看記錄情況:
SELECT ROW_NUMBER() OVER(partition by MovieType ORDER BY Name) as row, * FROM MovieInfo WHERE MovieType is not null
結果是:
row Name Link MovieType 1 007第二部 電影鏈接12 007 2 007第三部 電影鏈接13 007 3 007第一部 電影鏈接11 007 1 變形金剛第二部 電影鏈接2 變形金剛 2 變形金剛第三部 電影鏈接3 變形金剛 3 變形金剛第一部 電影鏈接1 變形金剛
OK,現在可以給出完整的查詢了,這個查詢需要用到聯合查詢,統計那些沒有分組的記錄:
select Name,Link,MovieType from ( SELECT ROW_NUMBER() OVER(partition by MovieType ORDER BY Name) as row, * FROM MovieInfo WHERE MovieType is not null ) t where t.row=1 union SELECT Name,Link,MovieType FROM MovieInfo WHERE MovieType is null
結果是:
Name Link MovieType 007第二部 電影鏈接12 007 變形金剛第二部 電影鏈接2 變形金剛 英雄 電影鏈接A1 NULL 終結者 電影鏈接A NULL
后來想想,如果沒有Row_Number 怎么辦?同事說可以利用聚合函數或者自查詢,下面是給出的2條SQL語句,功能一樣:
select * from MovieInfo a where name=(select MIN(name) from MovieInfo where MovieType=a.MovieType) select * from MovieInfo a where name=(select TOP 1 name from MovieInfo where MovieType=a.MovieType)
由於常常使用ORM,很久沒有練習SQL了,這里做一個筆記,感謝同事的指導。
下面是我今天練習這個SQL查詢的PDF.NET集成開發工具,該工具可以在官網找到下載鏈接。