2012-08-11 70 views
1

我正在使用SQL Server和Datatables在PHP环境中;我研究了一下,发现使用ROW_NUMBER我可以实现分页结果,但我正在逐渐:SQL Server row_number和datatables

多部分标识符“Flags.FlagValue”无法绑定。

SELECT dbo.PlayingCharacters.PlayerName,dbo.PlayingCharacters.CurrentLevel,dbo.PlayingCharacters.XP,(SELECT CASE WHEN dbo.PlayingCharacters.Karma >= 1 THEN 2 WHEN dbo.PlayingCharacters.Karma <= -1 THEN 1 ELSE 0 END) as Karma,ISNULL(Flags.FlagValue,0) AS Remort FROM (SELECT row_number() OVER (ORDER BY dbo.PlayingCharacters.XP desc) AS CI_offset_row_number, dbo.PlayingCharacters.PlayerName, dbo.PlayingCharacters.CurrentLevel, dbo.PlayingCharacters.XP, (SELECT CASE WHEN dbo.PlayingCharacters.Karma >= 1 THEN 2 WHEN dbo.PlayingCharacters.Karma <= -1 THEN 1 ELSE 0 END) as Karma, ISNULL(Flags.FlagValue, 0) AS Remort FROM dbo.PlayingCharacters LEFT JOIN dbo.Flags ON dbo.Flags.OwnerID = dbo.PlayingCharacters.UserID AND Flags.FlagID = 30419 WHERE dbo.PlayingCharacters.AccountName NOT IN (SELECT DISTINCT AccountName FROM UserFlags WHERE FlagBitPosition BETWEEN 0 AND 40) AND PlayingCharacters.AccountName NOT LIKE 'DeletedFrom:%') AS A WHERE A.CI_offset_row_number BETWEEN (141) AND (150) 

考察了查询,有点进一步研究我发现,“”近查询的结束可能是罪魁祸首。但我不确定。我在某种程度上熟悉SQL,但是看起来我似乎是一条出水的鱼。我似乎无法弄清楚如何解决这个问题。

我很抱歉,如果这可能已经被问过,我发现了一些关于我的错误的结果,但不能将任何成功的答案组合在一起。

作为一个方面说明,这是尝试添加的限制/偏移与row_number()

SELECT TOP 30 dbo.PlayingCharacters.PlayerName, dbo.PlayingCharacters.CurrentLevel, dbo.PlayingCharacters.XP, (SELECT CASE WHEN dbo.PlayingCharacters.Karma >= 1 THEN 2 WHEN dbo.PlayingCharacters.Karma <= -1 THEN 1 ELSE 0 END) as Karma, ISNULL(Flags.FlagValue, 0) AS Remort 
FROM dbo.PlayingCharacters 
LEFT JOIN dbo.Flags ON dbo.Flags.OwnerID = dbo.PlayingCharacters.UserID AND Flags.FlagID = 30419 
WHERE dbo.PlayingCharacters.AccountName NOT IN (SELECT DISTINCT AccountName FROM UserFlags WHERE FlagBitPosition BETWEEN 0 AND 40) AND PlayingCharacters.AccountName NOT LIKE 'DeletedFrom:%' 
ORDER BY dbo.PlayingCharacters.XP desc 

其中一期工程,但显然不执行所需的极限/偏移之前我的查询。我使用生成查询有问题的代码从被人掐住:http://codeigniter.com/forums/viewthread/160626/P10/#985759

回答

1

试试这个

SELECT temp.PlayerName,temp.CurrentLevel,temp.XP, temp.Karma,temp.Remort FROM(SELECT ROW_NUMBER)OVER(ORDER BY dbo.PlayingCharacters.XP递减()AS CI_offset_row_number, dbo.PlayingCharacters.PlayerName,dbo.PlayingCharacters.CurrentLevel, dbo.PlayingCharacters.XP,(SELECT CASE WHEN dbo.PlayingCharacters。 Karma> = 1 THEN 2 WHEN dbo.PlayingCharacters.Karma < = -1 THEN 1 ELSE 0 END)作为噶, ISNULL(Flags.FlagValue,0)AS remort在FROM dbo.PlayingCharacters LEFT JOIN dbo.Flags ON dbo.Flags.OwnerID = dbo.PlayingCharacters.UserID AND Flags.FlagID = 30419 WHERE dbo.PlayingCharacters.AccountName NOT IN(SELECT DISTINCT帐户名 FROM UserFlags WHERE FlagBitPosition 0至40)和 PlayingCharacters.AccountName NOT LIKE 'DeletedFrom:%')Temp其中 temp.CI_offset_row_number BETWEEN(141)和(150)

+0

非常感谢@ user1562231 - 正是医生订购的!我想我并没有考虑到我从数据集中选择子查询生成的事实。在这里阅读您的SQL,使用您使用的命名cnvention(“temp”),这对我更有意义。非常感谢! – 2012-08-12 02:54:48