1

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

在 E 表中有列:

  • 有 6 个字母的 COD_Obj

  • 有 3 个字母的 COD_P

在 V 表中有一列:

  • as可以互斥的O_OR_P
    • 一个包含 9 个字母并将其前 6 个字母与 E.COD_Obj 匹配的 Obj
    • 一个包含 12 个字母的 P,并将其最后 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 来查询它们。

4

1 回答 1

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
于 2014-01-24T01:25:19.403 回答