2

谁能解释一下我们如何根据条件使用加入。假设我正在根据一个条件过滤数据,现在我担心的是,如果一个特定的 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

4 回答 4

1

你所拥有的东西(肯定是在 MS SQL Server 中的 SPROC 中)与次要的 mods 一起工作。

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 参数嗅探将缓存它下行的第一个路径的计划,这对于通过代码的其他路径不一定是最佳的。

此外,如果您确实对您的 proc 采用这种“多重替代查询”方法,通常最好确保返回的列名和类型在所有情况下都是相同的(您的查询很好,因为它是 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

如果您需要添加过滤器等,请查看这篇文章:动态/以编程方式将 WHERE 子句添加到 SQL

于 2012-08-24T10:31:27.337 回答
0

尝试以下查询

SELECT A.*
FROM A
INNER JOIN B on B.id=A.id
INNER JOIN C on C.id=A.id and @bool=1
于 2012-08-24T11:07:33.963 回答
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存储在 tableAB.

于 2012-08-24T10:25:17.647 回答
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限制。

于 2012-08-24T10:30:48.390 回答