我能在JOIN语句中使用CASE语句吗?

195

以下图片是 Microsoft SQL Server 2008 R2 系统视图的一部分。从图片中我们可以看到 sys.partitionssys.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语句引起的。有人可以帮忙解释一下吗?


添加错误信息:

Msg 102,Level 15,State 1,Line 6 Incorrect syntax near '='.

这是图片


50
你用什么软件制作了这个漂亮的数据库图表? - LearnByReading
3
@LearnByReading,你最终找出使用的是哪个软件了吗? - Preston
1
@User632716 不好意思,不是的! - LearnByReading
3
虽然我确实认为那是MySQL Workbench,但我从未收到回复。 - LearnByReading
3
看起来很像Visual Paradigm - Harry Jones
显示剩余2条评论
11个回答

0
虽然其他人已经展示了在连接条件中使用case表达式的可能性,但这可能会对索引等产生严重影响。
我建议更好的方法是将条件分开并将它们联合起来。
SELECT
    *
FROM sys.indexes                    AS i
    INNER JOIN sys.partitions       AS p
        ON i.index_id = p.index_id

    INNER JOIN sys.allocation_units AS a
        ON p.hobt_id  = a.container_id
WHERE a.type IN ( 1, 3 )

UNION ALL

SELECT
    *
FROM sys.indexes                    AS i
    INNER JOIN sys.partitions       AS p
        ON i.index_id     = p.index_id

    INNER JOIN sys.allocation_units AS a
        ON p.partition_id = a.container_id
WHERE a.type = 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接