【问题标题】:Using Join based on condition根据条件使用 Join
【发布时间】:2012-08-25 02:39:54
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 你的意思是 else if 而不是 and if 吗?

标签: sql join


【解决方案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

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

【讨论】:

  • 我不想使用这两个条件。除了两个不同的条件,我们不能在单一条件下执行此操作,例如 select A.* from A inner join B on B.id=A.id case when @bool=1 then inner join C on c.id like this 我知道它的错误方式,但想要类似的逻辑。谢谢你
  • @champ - 使用动态 sql 选项更新。我从你之前的帖子中假设了 sql server。
  • 嘿,nonnb 非常感谢,我认为动态 sql 是更好的选择。再次感谢
  • @champ - 欢迎您!使用动态 sql 时要记住的一件事是确保任何变量等都被参数化(其中 myfield=@value1 等)。否则你将容易受到 SQL 注入的攻击。
【解决方案2】:
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】:

    试试下面的查询

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

    【讨论】:

      【解决方案4】:

      你使用联合来做:

      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 中。

      【讨论】:

        猜你喜欢
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-28
        • 1970-01-01
        • 2016-09-29
        • 2011-11-16
        • 2021-09-24
        相关资源
        最近更新 更多