下图是Microsoft SQL Server2008 R2系统视图的一部分。从图中我们可以看到,sys.partitions
和sys.allocation_units
之间的关系取决于sys.allocation_units.type
的值。因此,为了将它们结合在一起,我会编写类似下面这样的代码:
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON CASE
WHEN a.type IN (1, 3)
THEN a.container_id = p.hobt_id
WHEN a.type IN (2)
THEN a.container_id = p.partition_id
END
但是上面的代码给出了一个语法错误。我猜这是因为CASE
语句。有人能帮我解释一下吗?
添加错误消息:
消息102,级别15,状态1,第6行'=‘附近的语法不正确。
发布于 2012-04-21 23:26:25
CASE
表达式从子句的THEN
部分返回值。你可以这样使用它:
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON CASE
WHEN a.type IN (1, 3) AND a.container_id = p.hobt_id THEN 1
WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1
ELSE 0
END = 1
请注意,您需要对返回值做一些处理,例如将其与1进行比较。您的语句试图返回赋值的值或相等测试,但这在CASE
/THEN
子句的上下文中都没有意义。(如果BOOLEAN
是一种数据类型,那么相等测试就有意义了。)
发布于 2012-04-21 14:41:48
相反,
只需连接这两个表,并在SELECT子句中从匹配的表中返回数据:
我建议你通过这个链接Conditional Joins in SQL Server和T-SQL Case Statement in a JOIN ON Clause
例如:
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON a.container_id =
CASE
WHEN a.type IN (1, 3)
THEN p.hobt_id
WHEN a.type IN (2)
THEN p.partition_id
END
编辑:根据评论。
您不能像现在这样指定联接条件..检查上面没有错误的查询。我已经去掉了公共列,右边的列值将在condition.
上求值。
发布于 2012-04-21 14:40:37
试试这个:
...JOIN sys.allocation_units a ON
(a.type=2 AND a.container_id = p.partition_id)
OR (a.type IN (1, 3) AND a.container_id = p.hobt_id)
https://stackoverflow.com/questions/10256848
复制相似问题