Order by 和 Limit 语法
Order by and Limit syntax
下面的 SQL 语句会在 ORDER BY
+ LIMIT
语法上引发错误,因此,如果我删除 LIMIT
,则可以正常工作。是否有语法错误或如何添加LIMIT
?
SELECT * FROM dbo.T0
WHERE id < (
SELECT ISNULL((SELECT a.id FROM dbo.T0 a, dbo.T0 b, dbo.T0 c
WHERE
(a.id = b.id + 1 AND a.var1 != b.var1)
AND
c.id < a.id
AND
c.timeD = '2015/08/10 18:38:00'
AND
c.var1 = 2
ORDER BY a.id LIMIT 1), (SELECT MAX(id) + 1 FROM dbo.T0)))
...
sql 服务器中没有 LIMIT
。
您可以使用 Select top 1 *
,但在您的情况下我宁愿使用 row_number
和常见的 table 表达式 (cte)。
所以(也有一些连接语法)
with cte as (select
a.id,
row_number() over(order by a.Id) rn
from dbo.T0 a
join dbo.T0 b on a.id = b.id + 1 and a.var1 != b.var1
join dbo.T0 c on c.id < a.id
where c.timeD = '2015/08/10 18:38:00'
and c.var1 = 2),
cte2 as (select id from cte where rn = 1
union
SELECT MAX(id) + 1 as id FROM dbo.T0)
select * from dbo.T0 where id < (select min(id) from cte2)
-- we take the min, here,
--as we want the first part of the union of cte2 if it exists
-- and it will always be smaller then max(id) + 1
下面的 SQL 语句会在 ORDER BY
+ LIMIT
语法上引发错误,因此,如果我删除 LIMIT
,则可以正常工作。是否有语法错误或如何添加LIMIT
?
SELECT * FROM dbo.T0
WHERE id < (
SELECT ISNULL((SELECT a.id FROM dbo.T0 a, dbo.T0 b, dbo.T0 c
WHERE
(a.id = b.id + 1 AND a.var1 != b.var1)
AND
c.id < a.id
AND
c.timeD = '2015/08/10 18:38:00'
AND
c.var1 = 2
ORDER BY a.id LIMIT 1), (SELECT MAX(id) + 1 FROM dbo.T0)))
...
sql 服务器中没有 LIMIT
。
您可以使用 Select top 1 *
,但在您的情况下我宁愿使用 row_number
和常见的 table 表达式 (cte)。
所以(也有一些连接语法)
with cte as (select
a.id,
row_number() over(order by a.Id) rn
from dbo.T0 a
join dbo.T0 b on a.id = b.id + 1 and a.var1 != b.var1
join dbo.T0 c on c.id < a.id
where c.timeD = '2015/08/10 18:38:00'
and c.var1 = 2),
cte2 as (select id from cte where rn = 1
union
SELECT MAX(id) + 1 as id FROM dbo.T0)
select * from dbo.T0 where id < (select min(id) from cte2)
-- we take the min, here,
--as we want the first part of the union of cte2 if it exists
-- and it will always be smaller then max(id) + 1