根据条件使用Join

时间:2012-08-24 10:22:07

标签: sql join

任何人都可以解释我如何在条件的基础上使用加入。 让我说我现在根据一个条件过滤数据我现在担心的是,如果一个特定的BIT类型参数值是1,那么数据集包括另一个加入,其他返回与之前相同。 这是三个表A,B,C 现在我想创建一个具有@bool位参数

的proc
if @bool=0
then  
select A.* from A 
inner join B on B.id=A.id
and if @bool=1 
then 
select A.* from A
INNER JOIN B on B.id=A.id
inner join C on C.id=A.id 

提前致谢。

4 个答案:

答案 0 :(得分:1)

你有什么工作(当然在MS SQL Server的SPROC中),使用较小的mod。

if @bool=0 then  
   select A.* from A 
   inner join B on B.id=A.id
else if @bool=1 then -- Or just else if @boll is limited to [0,1]
   select A.* from A
   INNER JOIN B on B.id=A.id
   inner join C on C.id=A.id 

但是,需要注意的是,SQL参数嗅探将缓存其下降的第一个路径的计划,这对于通过代码的其他路径不一定是最佳的。

另外,如果你对你的procs采用这种“多种替代查询”方法,通常最好确保返回的列名和类型在所有情况下都是相同的(你的查询很好,因为它是A. *)。

修改 假设您使用的是SQL Server,另一种方法是使用动态sql:

DECLARE @sql NVARCHAR(MAX)
SET @sql = N'select A.* from A 
             inner join B on B.id=A.id'

IF @bool = 1
    SET @sql = @sql + N' inner join C on C.id=A.id'

sp_executesql @sql

如果您需要添加过滤器等,请查看此帖子:Add WHERE clauses to SQL dynamically / programmatically

答案 1 :(得分:0)

你使用联盟:

SELECT A.* 
FROM A 
    INNER JOIN B on B.id=A.id 
WHERE bool = 0

UNION ALL

SELECT A.* 
FROM A 
    INNER JOIN B on B.id=A.id 
    INNER JOIN C on C.id=A.id 
WHERE bool = 1

我假设bool存储在表AB中。

答案 2 :(得分:0)

select A.* from A
inner join B on B.id = A.id
left outer join C on C.id = A.id and @bool = 1
where (@bool = 1 and C.id is not null) or @bool = 0

@bool = 1“激活”左外连接,可以这么说,并通过将其应用于WHERE子句,实际上将其转换为内连接。如果@bool = 0,那么左外连接将从C返回任何内容,并删除WHERE限制。

答案 3 :(得分:0)

尝试以下查询

SELECT A.*
FROM A
INNER JOIN B on B.id=A.id
INNER JOIN C on C.id=A.id and @bool=1