使用 SQL 来识别一对一记录与多对多记录

Using SQL to identify 1-to-1 records vs many-to-many

我正在 IBExpert 中修改现有查询。通常我们 运行 这个查询,将结果导出到 Excel,然后 运行 一个宏来创建一个新字段 - 我试图消除 Excel 中的步骤。

我们有两个来自不同 tables 的关键字段 - 我们称它们为来自项目的 ProjNo 和来自客户的 CustNo - 它们具有多对多关系。一个项目可以涉及多个客户,一个客户可以有多个项目运行ning。他们之间有一个linktable来经营关系

我们希望能够确定这些值之间存在 1:1 相关性的位置,其中 ProjNo 仅出现一次,而 CustNo 仅出现一次。我已经摸索了很多,试图将 Case When 语句放在一起,但我运气不佳。这是我最近的尝试:

(case when (select count(Proj.ProjNo) PCounts from Proj group by Proj.ProjNo)=1 and
           (select count(Cust.CustNo) CCounts from Cust group by Cust.CustNo)=1
      then "1:1" else "Multi" end) as Links

我知道我需要包含某种 Where 子句,它只检查与查询主体中的 ProjNo 匹配的值,但我不确定我是否在正确的方向或我如何将案例中的 SQL 语句连接到主查询。

帮忙?

这比它应该做的更棘手。三-table 连接让我想连接 Cust 和 Link,然后连接 Proj 和 Link,然后连接这些结果。它的诀窍是,一旦你加入了 table 对之一,你就不必为另一对做,只需 link 最后一个 table 进入 linked对。这听起来和我发现的编码一样令人困惑。

这是我想出的三向连接。

SELECT cnc.cust_tot, pn_link.CustNo, pn_link.ProjNo, pn_link.proj_tot
FROM
    (SELECT CustNo, Count(CustNo) as  cust_tot
    FROM Cust 
    GROUP BY CustNo) as cnc
INNER JOIN
    (SELECT a.CustNo, a.ProjNo, b.proj_tot
    FROM
    Link as a 
    INNER JOIN
        (SELECT ProjNo, Count(ProgNo) as proj_tot
        FROM Proj
        GROUP BY ProjNo) as b
    ON a.ProjNo = b.ProjNo) as pn_link
ON cnc.CustNo = pn_link.CustNo
WHERE cnc.cust_tot = 1
and pn_link.proj_tot = 1

最后我有 WHERE 语句来获取一对一的匹配项。要获得多重匹配,只需将其更改为

WHERE cnc.cust_tot > 1
or pn_link.proj_tot > 1

然后您可以 UNION 再次将两个查询合而为一 table。呼。