首页 > 解决方案 > 选择满足条件的每个字段

问题描述

我有一个表调用生产

factory_id | factory_name | product_id
         1 |            A |          1
         1 |            A |          2
         1 |            A |          3
         2 |            B |          3
         3 |            C |          1
         3 |            C |          2
         3 |            C |          3
         3 |            C |          4
         3 |            C |          5

我正在尝试开发一个查询,它将返回两个工厂名称对,这样 factory1 的每个产品都由 factory2 生产,结果如下所示:

factory_name_1 | factory_name_2
             A |              C
             B |              A
             B |              C

我有一些嵌套的自联接和重命名,但我无法理解如何应用EXISTSIN对于“为工厂 X 生产的每种产品做条件”的这种情况。感谢任何高级帮助。

更新:对不起,我忘了粘贴我的查询:

select t0.fname0, t1.fname1
from    (
        select factory_id as fid0, factory_name as fname0, product_id as pid0, count(distinct factory_id, product_id) as pnum0
        from production
        group by factory_id
    ) t0
    join
    (
        select factory_id as fid1, factory_name as fname1, product_id as pid1, count(distinct factory_id, product_id) as pnum1
        from production
        group by factory_id
    ) t1
where t0.fid0 <> t1.fid1
    and t0.pnum0 < t1.pnum1
    and t0.pid0 = t1.pid1;

更新 2:生产是唯一的表。预期的输出 factory1 和 factory2 只是 factory_name 属性的重命名。

标签: mysqlsql

解决方案


您需要JOIN查看每个工厂配对的表格,以确保它们“加入”相同product_id的 s,否则您最终可能会得到类似的 DISTINCT 计数,product_id但这些不一定指的是相同 product_id的 s。

这是我的看法:

SELECT bfna,afna, pcnt FROM (
   SELECT a.factory_name afna, b.factory_name bfna, COUNT(DISTINCT b.product_id) commoncnt
   FROM tbl a LEFT JOIN tbl b ON b.factory_name!=a.factory_name AND b.product_id=a.product_id 
   GROUP BY a.factory_name, b.factory_name
) c
INNER JOIN (
   SELECT factory_name fna, COUNT(DISTINCT product_id) pcnt
   FROM TBL GROUP BY factory_name
) d ON fna=bfna AND commoncnt=pcnt
ORDER BY bfna,afna

你可以在这里找到一个演示:https ://rextester.com/JJGCK84904

它产生:

bfna    afna    commoncnt
A       C       3
B       A       1
B       C       1

为简单起见,我省略了该列factory_id,因为它没有在此处添加任何信息。

有趣的事实:由于我只使用“简单”的 SQL 表达式,所以上面的代码也可以在 SQL-Server 上运行而无需任何更改。


推荐阅读