【问题标题】:SQL : First condition in OR statement in JOIN is always executed first?SQL:JOIN 中的 OR 语句中的第一个条件总是首先执行?
【发布时间】:2012-01-02 18:28:56
【问题描述】:

在 SQL Server 中,我有以下设计:

是否 100% 确定 JOIN 中 OR 语句的第一个条件将首先执行?那么下面的SQL语句会产生绿色的结果吗?

SELECT P.Name, D.Percentage
FROM Personnel P
JOIN Department D ON
  P.Dep_Code = D.Code AND
  (P.SubDep_Code = D.SubCode OR D.SubCode = '*')

【问题讨论】:

  • 这在很大程度上取决于您的数据库。强大的数据库,如 Oracle、DB2、SQL Server 将优化(考虑索引、直方图、约束等)。这是关于什么数据库的?
  • 这是 SQL Server(更新问题)
  • a or bb or a 在三元布尔逻辑中的含义相同。为什么要让连接过滤掉P-A | 100,因为连接条件对于下面的行是正确的?

标签: sql sql-server join conditional-statements


【解决方案1】:

是否 100% 确定 OR 语句中的第一个条件 JOIN 会先执行?

没有。没有保证的评估顺序,即使整个表达式仍然会评估为相同的值,并且不会影响连接中匹配的行。

您的查询将给出以下结果:

Name       Percentage
---------- -----------
P-A        100
P-A        20
P-A        80
P-B        100

我猜你正在寻找这样的东西。

select P.Name,
       coalesce(D1.Percentage, D2.Percentage) as Percentage
from Personnel as P
  left outer join Department as D1
    on P.Dep_Code = D1.Code and
       P.SubDep_Code = D1.SubCode
  left outer join Department as D2
    on P.Dep_Code = D2.Code and
       D2.SubCode = '*'
where coalesce(D1.Percentage, D2.Percentage) is not null

您可以使用 SQL Server 2008 在此处尝试查询。https://data.stackexchange.com/stackoverflow/qt/118492/

【讨论】:

    【解决方案2】:

    Mikael 的回答是正确的,但是这个修改后的查询版本更简洁:

    SELECT P.Name, D.Percentage
    FROM Personnel P
    JOIN Department D 
    ON P.Dep_Code = D.Code AND COALESCE(P.SubDep_Code,'*') = D.SubCode
    

    【讨论】:

      猜你喜欢
      • 2014-11-29
      • 2013-03-30
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 2016-10-02
      相关资源
      最近更新 更多