我在我的数据库中存储了一个消息列表(如果我崩溃了,我就不会丢失它们。)
但是当我将它们拉出来时,我需要将它们按顺序拉出来。
我正在寻找的是一个查询,它会在列IsWeirdMessage
= 1之前为我提供前x行。
所以,假设我有一个看起来像这样的表:
CREATE TABLE MyMessages(MessageId bigint IDENTITY(1,1),
MyMessage varchar(100), IsWeirdMessage bit)
INSERT INTO MyMessages(MyMessage, IsWeirdMessage)
SELECT 'SomeValue1', 0 UNION ALL
SELECT 'SomeValue2', 0 UNION ALL
SELECT 'SomeValue3', 0 UNION ALL
SELECT 'SomeValue3', 0 UNION ALL
SELECT 'SomeValue4', 0 UNION ALL
SELECT 'SomeValue5', 0 UNION ALL
SELECT 'WeirdThingHere', 1 UNION ALL
SELECT 'SomeValue7', 0 UNION ALL
SELECT 'SomeValue8', 0 UNION ALL
SELECT 'SomeValue9', 0 UNION ALL
SELECT 'OtherWeirdStuff', 1 UNION ALL
SELECT 'SomeValue11', 0
GO
我怎样才能制作一个查询,通过 SomeValue5 (按顺序)来获取 SomeValue1 ,并键入IsWeirdMessage
?
答案 0 :(得分:5)
这样的事情应该这样做:
select * from MyMessages
where messageid > @MessageID
and messageid <=
(select min(messageid) from MyMessages
where IsWeirdMessage = 1 and messageid > @MessageID)
order by messageid
@MessageID是您检索的最后一个奇怪消息的值。您将从0开始获得第一批,然后从7开始获得第二批等等。
答案 1 :(得分:1)
SELECT m.MessageID, m.MyMessage
FROM dbo.MyMessages AS m
WHERE NOT EXISTS
(
SELECT 1 FROM dbo.MyMessages AS m2
WHERE IsWeirdMessage = 1
AND m2.MessageID < m.MessageID
)
ORDER BY MessageID;
答案 2 :(得分:0)
select b.*
from
( select
row_number() over (order by (select 1)) as PartitionId
,isnull((select max(t.MessageId) from MyMessages t where t.MessageId < tb.MessageId and t.IsWeirdMessage = 1), 0) as StartID
,tb.MessageId as EndId
from MyMessages tb
where IsWeirdMessage = 1
union all
select count(case when IsWeirdMessage = 1 then MessageId else null end) + 1
,max(case when IsWeirdMessage = 1 then MessageId else 0 end)
,max(messageId) + 1
from MyMessages
) as a
cross apply
( select * from MyMessages b
where
b.MessageId > a.StartID
and b.MessageId < a.EndID
) as b
where a.PartitionId = @PartID
其中@PartID是您要选择的分区标识符