【问题标题】:Skip the joins based on the condition without dynamic query根据条件跳过连接,无需动态查询
【发布时间】:2015-07-22 06:09:39
【问题描述】:

我有一个场景,就像我有两个名为 tbl1tb2 的桌子

Select * from tbl1 t1 inner join tb2 t2 on t1.Id = t2.id

上面我需要实现的示例查询是我需要根据条件执行这个内部连接。 (即)我将传递输入参数IsJoin 作为真正的手段,否则我可以执行内部连接。我不喜欢动态查询。请让我知道是否有任何其他方法可以实现这一目标。

提前致谢

【问题讨论】:

  • 如果您在查询执行时经过Logical Query processing phases,那么您会看到From clause and joins 作为查询中的第一件事执行,然后是where 子句和其余部分。所以我相信除了编写动态查询之外没有其他方法可以不计算inner join..我希望这会有所帮助..

标签: sql sql-server join


【解决方案1】:

只有一种方法可以做到这一点 - 使用 IFELSE 语句

IF <YOUR CONDITION>
BEGIN
    SELECT *
    FROM tbl1 t1
    INNER JOIN tb2 t2
        ON t1.Id = t2.id;
END
ELSE
BEGIN
    SELECT *
    FROM tbl1 t1;
END

如果只是几个条件,那么可以使用多个语句来执行此操作,但是如果它是基于条件的大量连接 - 维护动态 SQL 会更容易。而且它变得更具可读性。

【讨论】:

  • 感谢您的回复。但我不能更喜欢这个,因为我有更多的表可以根据不同的条件加入。有没有其他方法可以实现这一点。
  • 您可以尝试按照@Parado 的建议进行操作 - 但性能可能不是那么好。我个人会在这里选择动态 SQL,因为没有其他真正的选择。
【解决方案2】:

试试这个方法:

declare @IsJoin numeric(1,0)
select @IsJoin = 1

Select * from tbl1 t1 
left join tb2 t2 on t1.Id = t2.id
                 and @IsJoin = 1

【讨论】:

  • 感谢您的回复。但是 Select * from tbl1 t1 left join tb2 t2 on t1.Id = t2.id where @IsJoin = 1 也可以,但我怀疑left join是否会在后端运行???。但我需要一个结果,因为我应该跳过左连接
  • @user2003780 你想从tb2返回数据吗?
【解决方案3】:

如果需要保留 t1 和 t2 的所有列,无论是否加入

DECLARE @IsJoin bit = 1 -- 1 for true; 0 for false

SELECT 
    * 
FROM
    tbl1 t1 
    LEFT OUTER JOIN tbl2 t2 on t1.Id = t2.id and @IsJoin = 1
WHERE 
    (@IsJoin = 0 OR t2.id is not null) -- Keep the inner join behavior

【讨论】:

    猜你喜欢
    • 2022-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多