我正在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语句连接到主查询。
帮助?
答案 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
这两个查询再次在一个表中获取所有查询。呼。