SQL Server CE 4.0按排序列顺序选择记录

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,所以我一直在尝试一个没有运气的小组。 欢迎您的任何意见 谢谢 编辑: 下面是一些实际运

我已经试着让它工作了一段时间了,是时候问问了。我使用的是SQLServerCE4.0,下面的SQL语句返回记录,但我试图向它添加一个额外的要求

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添加第二个加入,以确保在所需顺序中第一首歌曲之后有第二首歌曲

因此,下文将:

  • 确保歌曲表中存在歌曲
  • 确保同一节目的下一首已排序歌曲在ShowSonggref中
  • 因此,只有在同一个节目中排序的、在下一个节目之后为1的歌曲才会被返回。但只有配对中的第一首歌作为第二首歌没有后续歌曲;但是,这两首歌都可用,因为您可以使用ref和ref2


    --按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')