左连接有两个独有的条件

时间:2014-01-24 01:21:27

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

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

在E表中有列:

  • COD_Obj有6个字母

  • COD_P有3个字母

在V表中有一列:

  • O_OR_P,可以互相排斥
    • 一个有9个字母的Obj,它的前6个字母与E.COD_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服务器中,我正在使用Microsoft Office的Access来查询它们。

1 个答案:

答案 0 :(得分:0)

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

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