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不能同时满足这两个条件,您的一个内部联接将失败,查询将不会返回任何结果。您希望使用中的左联接。单击“提交”后,您意识到:)。更改了查询。