使用 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。呼。
我正在 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。呼。