【问题标题】:Left join with two exclusive conditions具有两个独占条件的左连接
【发布时间】:2014-01-24 01:21:26
【问题描述】:

我有两个表 V 和 E,我需要做一个奇怪的 LEFT JOIN。

在 E 表中有列:

  • 有 6 个字母的 COD_Obj

  • 有 3 个字母的 COD_P

在V表中有一列:

  • 互斥的O_OR_P
    • 一个包含 9 个字母且前 6 个字母与 E.COD_Obj 匹配的 Obj
    • 一个 P,它有 12 个字母,最后 3 个字母与 E.COD_P 匹配

我尝试了以下查询:

SELECT DSC,
COUNT(IIF([Cost] IS NOT NULL, 1, NULL)) AS [N Cost]
, INT(SUM(IIF([Cost] IS NOT NULL, [Cost], 0))) AS [Total Cost]
, INT(SUM(IIF([Fees] IS NOT NULL, Fees, 0))) AS [Total Fees]
 LEFT JOIN E ON LEFT(V.P_OR_O,6)=E.COD_Obj 
  OR RIGHT(V.P_OR_O,3)=E.COD_P
 GROUP BY DSC
ORDER BY DSC

分组正确,但每个组返回太多的 N 成本、总成本和总费用。我怀疑这个查询的结果有重复的东西。

如果我将 LEFT JOIN 的 OR 更改为 AND,我将只看到一行,只对应一个组。

我感到眼花缭乱和困惑。请帮助了解如何使用两个替代标准进行匹配。而且,在你问之前,是的,V.P_OR_O 字段可以有空/空值。

不,我现在不能改变数据模型,因为人们依赖这个数据库,我无法控制服务器重新定义数据库结构。

这些表都在 SQL Server 中,我正在使用 Microsoft Office 的 Access 来查询它们。

【问题讨论】:

    标签: sql ms-access left-join multiple-conditions


    【解决方案1】:

    您应该能够在连接条件中添加长度,如下所示:

    SELECT 
    DSC
    , COUNT(IIF([Cost] IS NOT NULL, 1, NULL)) AS [N Cost]
    , INT(SUM(IIF([Cost] IS NOT NULL, [Cost], 0))) AS [Total Cost]
    , INT(SUM(IIF([Fees] IS NOT NULL, Fees, 0))) AS [Total Fees]
    FROM V
    LEFT JOIN 
    E 
    ON   (LEFT(V.P_OR_O,6)=E.COD_Obj AND LEN(IIF(ISNULL(P_OR_O),'',P_OR_O)) = 9)
      OR (RIGHT(V.P_OR_O,3)=E.COD_P AND LEN(IIF(ISNULL(P_OR_O),'',P_OR_O)) = 12)
    GROUP BY DSC
    ORDER BY DSC
    

    【讨论】:

    • 我更正了查询,因为它不起作用。 Access 中的 ISNULL 有不同的含义:它表示该值是否为空。我删除了链接,因为它们指向的文档不对应
    • Altought 现在的值有点低,查询仍然给我的值大于它应该的值!
    • 尝试删除总和和分组依据,将其运行到 excel 中,看看哪里出错了。该查询对我来说看起来不错,因此您的数据或您对数据的描述存在问题。如果表 V 有值,而您只想要表 E 中有条目的值,请切换连接的顺序 FROM E LEFT JOIN V
    • 没有。我想要 V 的所有值,即使它们与 E 中的条目不匹配。但是,如果我在没有以 LEFT JOIN 开头的部分针对 V 表的情况下执行此查询,则值的总和小于执行为它是它自己。
    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    相关资源
    最近更新 更多