Tsql sql server 2005/2008条件联接

Tsql sql server 2005/2008条件联接,tsql,stored-procedures,view,Tsql,Stored Procedures,View,有没有条件连接之类的东西: SELECT * FROM TABLE1 A IF (a=='TABLE2') THEN INNER JOIN TABLE2 B ON A.item_id=B.id ELSE IF (a=='TABLE3') THEN INNER JOIN TABLE3 C ON A.item_id=C.id 而a是表1中的一个字段 我喜欢在存储过程中使用它,而不使用动态sql(不将查询写入字符串和EXEC(@query)) 编辑:我不能写: IF (a=='TAB

有没有条件连接之类的东西:

SELECT *
FROM TABLE1 A
    IF (a=='TABLE2') THEN INNER JOIN TABLE2 B ON A.item_id=B.id
    ELSE IF (a=='TABLE3') THEN INNER JOIN TABLE3 C ON A.item_id=C.id
而a是表1中的一个字段

我喜欢在存储过程中使用它,而不使用动态sql(不将查询写入字符串和EXEC(@query))

编辑:我不能写:

IF (a=='TABLE2) THEN queryA
ELSE IF (a=='TABLE3') THEN queryB

因为a是表1的一个字段。

根据要求更新了查询:

SELECT * FROM
(
    SELECT * 
        FROM TABLE1 A  INNER JOIN TABLE2 B 
            ON A.a='TABLE2' --This will eleminate the table rows if the value of A.a is not 'TABLE2' 
         AND A.item_id=B.id) A,
             (SELECT * FROM
             INNER JOIN TABLE3 C 
            ON A.a='TABLE3' --This will eleminate the table rows if the value of A.a is not 'TABLE3'
            AND A.item_id=C.id 
                ) B
) a

编辑:根据以下评论修改答案:

你可以尝试通过一些左连接变得聪明。这将返回更多的列,因此您可能希望比只选择*更具辨别力

SELECT *
    FROM TABLE1 A
        LEFT JOIN TABLE2 B
            ON A.item_id = B.id
                AND A.a = 'TABLE2'
        LEFT JOIN TABLE3 C
            ON A.item_id = C.id
                AND A.a = 'TABLE3'
    WHERE (B.id IS NOT NULL AND A.a = 'TABLE2')
       OR (C.id IS NOT NULL AND A.a = 'TABLE3')

@Naor:根据你的评论修改了我的答案。我想补充一点,你可能需要合并输出列表中B和C的一些列,否则,调用者将需要区分1)可能同名的列和2)重复分支逻辑。@Cade Roux:+1这正是我说他希望比
SELECT*
更具辨别力时想表达的观点。谢谢你说得比我好。@Cade Roux:SELECT*只是一个例子@Joe Stefanelli:关于您的解决方案的问题-尽管“a”等于“表3”,tsql是否在表2中搜索metch行?或者tsql足够聪明,可以取消表2中的搜索?@Naor:是的,这就是在联接条件中包含对A.A的检查的目的。由于A.A不能同时满足这两个条件,您的一个内部联接将失败,查询将不会返回任何结果。您希望使用中的左联接。单击“提交”后,您意识到:)。更改了查询。