使用SQL识别1对1记录与多对多记录

时间:2016-10-17 19:06:15

标签: sql firebird

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

我们有两个来自不同表格的关键字段 - 让我们称之为来自Projects的ProjNo,以及来自客户的CustNo - 它们具有多对多的关系。一个项目可以涉及多个客户,一个客户可以运行多个项目。它们之间有一个链接表来管理这种关系。

我们希望能够确定这些值之间存在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匹配的值,但我不确定我是否在正确的方向或我是怎么做的将Case中的SQL语句连接到主查询。

帮助?

1 个答案:

答案 0 :(得分:1)

这比任何权利都要棘手。三表连接让我想加入Cust和Link,然后是Proj和Link,然后加入这些结果。它的诀窍是,一旦你加入其中一个表对,你就不必为另一对表做,只需将最后一个表链接到链接对。这听起来像我发现编码一样令人困惑。

所以这就是我提出的三方联系。

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这两个查询再次在一个表中获取所有查询。呼。