2017-04-10 86 views
0

我一直試圖讓這個工作一段時間,所以有時間問。我正在使用SQL Server CE 4.0,下面的SQL語句會返回記錄,但我試圖向它添加一個更多的需求。SQL Server CE 4.0按排序順序選擇記錄

ShowSongRef表中,有SongOrder列。我只想返回歌曲所在的節目。

換句話說,對於SongID的硬編碼,它們需要有1和2或4和5的SongOrder,任何組合,只要它是有序的,一首歌曲正好在另一個之後播放,它可以是一組歌曲(超過兩個)。

SELECT sh.ID 
FROM Songs s 
INNER JOIN ShowSongRef ref ON ref.SongID = s.ID 
INNER JOIN Shows sh ON sh.ID = ref.ShowID 
WHERE ref.SongID IN ('654', '321') 

--ORDER BY sh.ID, ref.SongOrder 

所有需要的是sh.ID,所以我一直在嘗試GROUP BY,沒有運氣。 任何輸入讚賞。

謝謝!

編輯:

下面是一些SQL實際運行和測試

的選擇以下建議是行不通的。

DECLARE @Shows TABLE (ID INT) 
INSERT INTO @Shows (ID) VALUES (1) 
INSERT INTO @Shows (ID) VALUES (1546) 

DECLARE @Songs TABLE (ID INT, Name VARCHAR(256)) 
INSERT INTO @Songs (ID, Name) VALUES (1, 'Song 1') 
INSERT INTO @Songs (ID, Name) VALUES (2, 'Song 2') 
INSERT INTO @Songs (ID, Name) VALUES (3, 'Song 3') 
INSERT INTO @Songs (ID, Name) VALUES (654, 'Song 4') 
INSERT INTO @Songs (ID, Name) VALUES (321, 'Song 5') 


DECLARE @ShowSongRef TABLE (ID INT, ShowID INT, SongID INT, SongOrder INT) 
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (1, 1, 1, 1) 
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (2, 1, 2, 2) 
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (3, 1, 321, 3) 
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (4, 1, 3, 4) 

INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (5, 1546, 3, 1) 
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (6, 1546, 1, 2) 
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (7, 1546, 654, 3) 
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (8, 1546, 321, 4)  

SELECT sh.ID 
FROM @Songs s 
INNER JOIN @ShowSongRef ref ON ref.SongID = s.ID 
INNER JOIN @ShowSongRef ref2 ON ref2.SongID = s.ID 
          AND Ref2.SongOrder = Ref.SongOrder + 1 
          AND ref.ShowID = ref2.ShowID 
INNER JOIN @Shows sh ON sh.ID = ref.ShowID 
WHERE ref.SongID IN ('654', '321') 

回答

0

向ShowSongRef添加第二次連接,以確保在所需順序中的第一首後面有第二首歌曲。

所以下面將:

  1. 確保歌曲在歌曲表存在。
  2. 確保下一首按順序播放的歌曲在ShowSonggref中進行同一個節目。

因此,只有在同一節目中排序的歌曲在下一首後纔會被返回。但只有配對中的第一首作爲第二首歌曲Doens't沒有後續的歌曲;然而,既然你有ref和ref2,兩首歌都可以使用。

--SELECT sh.ID, s.Name, ref.SongOrder FROM Songs s 

SELECT sh.ID FROM Songs s 
INNER JOIN ShowSongRef ref 
    ON ref.SongID = s.ID 
INNER JOIN ShowSongRef ref2 
    ON ref2.SongID = s.SongID - ok we need to make sure the song is fk to songs 
and Ref2.SongOrder = Ref.SongOrder+1 --this is the trick (assumes song order is numeric) 
and ref.ShowID = ref2.ShowID -- we only want to consider songs in the same show 
INNER JOIN Shows sh 
    ON sh.ID = ref.ShowID 
WHERE ref.SongID IN ('654', '321') 

--ORDER BY sh.ID,ref.SongOrder

+0

我更新我的問題與一些臨時表來測試。你的建議似乎應該可行,但事實並非如此。 –