尝试按照Calendar Recurring/Repeating Events - Best Storage Method使用SQL Server 2005设计数据库。
当我在下面运行查询时
SELECT EV.*
FROM events EV
RIGHT JOIN events_meta EM1 ON EM1.event_id = EV.id
RIGHT JOIN events_meta EM2 ON EM2.meta_key = CONCAT( 'repeat_interval_', EM1.id )
WHERE EM1.meta_key = 'repeat_start'
AND (
( CASE ( 1299132000 - EM1.meta_value )
WHEN 0
THEN 1
ELSE ( 1299132000 - EM1.meta_value )
END
) / EM2.meta_value
) = 1
LIMIT 0 , 30
我正在'CONCAT' is not a recognized built-in function name.
我搜索过,似乎只支持SQL Server 2012.如何使用SQL Server 2005/2008实现此目的? 那么SQL Server中的LIMIT语法呢?
我想要上面的sql版本的查询。
答案 0 :(得分:2)
SQL Server等效限制为TOP。 e.g
SELECT TOP 10 ID
FROM Table.
TOP并不是LIMIT的真正同义词,因为你不能传递2个参数(例如LIMIT 10,20)来指定起点。在SQL Server 2012中,等效值为OFFSET FETCH,但在2005和2008版本中,您需要使用ROW_NUMBER并过滤此值,例如。
SELECT *
FROM ( SELECT *, RowNum = ROW_NUMBER() OVER(ORDER BY ID)
FROM T
) t
WHERE t.RowNumber BETWEEN 10 AND 30;
您可以+
使用concatenate strings:
SELECT 'a' + 'b'
SQL Server 2012引入了CONCAT函数
答案 1 :(得分:1)
SQL Server到CONCAT()的等效函数是+,您可以使用TOP关键字限制结果集。
将您的查询写为:
SELECT TOP 30 EV.*
FROM events EV
RIGHT JOIN events_meta EM1 ON EM1.event_id = EV.id
RIGHT JOIN events_meta EM2 ON EM2.meta_key = 'repeat_interval_' + CAST (EM1.id as varchar(10)) -- cast is required in case id column is int
WHERE EM1.meta_key = 'repeat_start'
AND (
( CASE ( 1299132000 - EM1.meta_value )
WHEN 0
THEN 1
ELSE ( 1299132000 - EM1.meta_value )
END
) / EM2.meta_value
) = 1
答案 2 :(得分:1)
假设EM1.id属于int类型,首先必须将其转换为varchar 。
要连接使用+
运算符。并在Sql-server 中使用 TOP代替LIMIT。
这应该有效:
SELECT TOP 30 EV.*
FROM events EV
RIGHT JOIN events_meta EM1 ON EM1.event_id = EV.id
RIGHT JOIN events_meta EM2 ON EM2.meta_key = ('repeat_interval_' + CONVERT(nvarchar(max), EM1.id))
WHERE EM1.meta_key = 'repeat_start'
AND (
( CASE ( 1299132000 - EM1.meta_value )
WHEN 0
THEN 1
ELSE ( 1299132000 - EM1.meta_value )
END
) / EM2.meta_value
) = 1