SQL Server CE 4.0按排序列顺序选择记录
我已经试着让它工作了一段时间了,是时候问问了。我使用的是SQLServerCE4.0,下面的SQL语句返回记录,但我试图向它添加一个额外的要求 在SQL Server CE 4.0按排序列顺序选择记录,sql,sql-server-ce,Sql,Sql Server Ce,我已经试着让它工作了一段时间了,是时候问问了。我使用的是SQLServerCE4.0,下面的SQL语句返回记录,但我试图向它添加一个额外的要求 在ShowSongRef表中,有SongOrder列。我只想把歌曲放好的节目还回去 换句话说,对于下面硬编码的SongID,他们需要有1和2或4和5的SongOrder,任何组合,只要顺序正确,一首歌紧接着另一首歌播放,可以是一组歌(多于两首) 所有需要的是sh.ID,所以我一直在尝试一个没有运气的小组。 欢迎您的任何意见 谢谢 编辑: 下面是一些实际运
ShowSongRef
表中,有SongOrder
列。我只想把歌曲放好的节目还回去
换句话说,对于下面硬编码的SongID,他们需要有1和2或4和5的SongOrder
,任何组合,只要顺序正确,一首歌紧接着另一首歌播放,可以是一组歌(多于两首)
所有需要的是sh.ID,所以我一直在尝试一个没有运气的小组。
欢迎您的任何意见
谢谢
编辑:
下面是一些实际运行和测试的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')
向ShowSongRef添加第二个加入,以确保在所需顺序中第一首歌曲之后有第二首歌曲 因此,下文将:
--按sh.ID,ref.SongOrder排序我用一些临时表格更新了我的问题以进行测试。你的建议似乎应该行得通,但行不通。
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')
--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')