【问题标题】:Conditional Inner Join with two Functions带有两个函数的条件内连接
【发布时间】:2021-03-21 11:22:04
【问题描述】:

我有两个功能。我需要根据一个 BIT 值来决定是否加入这两个。

ON APEL.data_Period_dataination_Lookup_ID = CCEL.data_Period_dataination_Lookup_ID
INNER JOIN  markcommon.GetPredecessordatadataIds() AS PIDS
IF @Combined_Flag=1 
BEGIN
ON PIDS.data_Period_dataination_Identifier = APEL.data_Period_dataination_Identifier
AND PIDS.data_Period_Identifier = APL.data_Period_Identifier
END

基本上

如果 BIT=0 加入函数 1,否则加入函数 2

我尝试放置一个 IF 子句 .. 但它似乎不起作用。正确的做法是什么?

【问题讨论】:

  • @DaleK 然后加入另一个函数。
  • @DaleK 我被建议使用 if 条件和 temptable 而不是 joins。
  • 谁和为什么?您必须有一个非常复杂的查询,其中包含很多行才能需要该解决方案恕我直言。关于 SQL 的一件事是您不希望花费太多时间来尝试先发制人的性能问题。内置的优化器通常非常好。如果存在性能问题,那么您需要找出解决方法。
  • @DaleK 我的架构师,其中一个数据将始终为空,我会不必要地加入......她说......
  • 请引用你为ifclause找到的文档。

标签: sql sql-server tsql join


【解决方案1】:

我认为你可以使用LEFT JOIN

    ON APEL.data_Period_dataination_Lookup_ID = CCEL.data_Period_dataination_Lookup_ID LEFT JOIN
    markcommon.GetPredecessordatadataIds() PIDS
    ON @Combined_Cohort = 1 AND
       PIDS.data_Period_dataination_Identifier = APEL.data_Period_dataination_Identifier AND
       PIDS.data_Period_Identifier = APL.data_Period_Identifier
. . .
WHERE @Combined_Cohort <> 1 OR PIDS.data_Period_dataination_Identifier IS NOT NULL

【讨论】:

    【解决方案2】:

    只需将您的静态条件添加为连接条件的一部分并使用LEFT JOIN 以确保它适用于缺失的行。然后,您可以在选择中使用 case 表达式来获取正确的列,例如

    SELECT
    
        CASE WHEN F1.id IS NOT NULL THEN F1.MyColumn ELSE F2.MyColumn END
    
    FROM ...
    
    LEFT JOIN markcommon.Function1() AS F1
      ON @Combined_Cohort = 1
      AND {The rest of the join conditions}
    
    LEFT JOIN markcommon.Function2() AS F2
      ON @Combined_Cohort = 0
      AND {The rest of the join conditions}
    

    【讨论】:

      【解决方案3】:

      您可以按如下方式使用LEFT JOIN

      APEL.data_Period_dataination_Lookup_ID = CCEL.data_Period_dataination_Lookup_ID
      LEFT JOIN  markcommon.GetPredecessordatadataIds() AS PIDS
             ON (@Combined_Flag=1 AND PIDS.data_Period_dataination_Identifier = APEL.data_Period_dataination_Identifier
              AND PIDS.data_Period_Identifier = APL.data_Period_Identifier
              )
      LEFT JOIN FUNCTION2() AS PIDS2
             ON (@Combined_Flag=0 AND <<join condition for function 2>>
              )
      

      【讨论】:

        【解决方案4】:

        请同时检查:

        SELECT
            IIF(F1.id IS NOT NULL,F1.MyColumn,F2.MyColumn)    
        FROM ...
        
        LEFT JOIN markcommon.Function1() AS F1
          ON @Combined_Cohort = 1 
          AND {The rest of the join conditions}
        
        LEFT JOIN markcommon.Function2() AS F2
          ON @Combined_Cohort != 1 
          AND {The rest of the join conditions}
        

        【讨论】:

        • 请不要在您的答案中发布不相关的链接 - 它们将被视为垃圾邮件并删除您的答案。另外,您的答案在 3 个现有答案中添加了什么?
        猜你喜欢
        • 1970-01-01
        • 2015-09-19
        • 1970-01-01
        • 2017-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-15
        • 1970-01-01
        相关资源
        最近更新 更多