指定在SQL Oracle中生产一个部件的两个供应商

指定在SQL Oracle中生产一个部件的两个供应商,sql,oracle,Sql,Oracle,我需要一个我无法准确理解的基本查询的帮助。 所以我有一张供应商表和一张零件表。在零件表中,供应商编号与零件编号一起列出。在供应商表中,供应商编号与供应商名称一起列出。我想获得由两个不同供应商生产的零件的零件号和供应商名称 SELECT s.supplier_name, p.part_num FROM supplier s, part p WHERE s.supplier_num = p.supplier_num GROUP BY s.supplier_name, p.part_num HAVIN

我需要一个我无法准确理解的基本查询的帮助。 所以我有一张供应商表和一张零件表。在零件表中,供应商编号与零件编号一起列出。在供应商表中,供应商编号与供应商名称一起列出。我想获得由两个不同供应商生产的零件的零件号和供应商名称

SELECT s.supplier_name, p.part_num
FROM supplier s, part p
WHERE s.supplier_num = p.supplier_num
GROUP BY s.supplier_name, p.part_num
HAVING COUNT(p.part_num) > 1;

这是我到目前为止得到的结果,但对于列出两次而不是两次的零件,它只返回一个结果,我不知道如何同时获得这两个结果。

使用派生表来获取具有多个供应商的零件编号。然后将其连接到其他表以获得所需的结果

select s.supplier_name, p.part_num
from supplier s
join part p on s.supplier_num = p.supplier_num
join (SELECT part_num
      FROM part 
      group by part_num
      HAVING COUNT(distinct supplier_num) > 1) t
on p.part_num = t.part_num

使用派生表获取具有多个供应商的零件编号。然后将其连接到其他表以获得所需的结果

select s.supplier_name, p.part_num
from supplier s
join part p on s.supplier_num = p.supplier_num
join (SELECT part_num
      FROM part 
      group by part_num
      HAVING COUNT(distinct supplier_num) > 1) t
on p.part_num = t.part_num

我认为你的查询无法得到一个以上供应商生产的零件清单。原因是您正在按供应商名称分组。您可以尝试以下方法:

SELECT * FROM (
    SELECT s.supplier_name, p.part_num
         , COUNT(*) OVER ( PARTITION BY p.part_num ) AS supplier_cnt
      FROM supplier s INNER JOIN part p
        ON s.supplier_num = p.supplier_num
) WHERE supplier_cnt > 1;

在这里,我使用COUNT*作为窗口分析函数,而不是聚合函数。在窗口函数的分区中使用part_num将获得每个零件的供应商数量。这确实假设供应商表或零件表中没有重复项。

我认为您的查询无法获得由多个供应商生产的零件列表。原因是您正在按供应商名称分组。您可以尝试以下方法:

SELECT * FROM (
    SELECT s.supplier_name, p.part_num
         , COUNT(*) OVER ( PARTITION BY p.part_num ) AS supplier_cnt
      FROM supplier s INNER JOIN part p
        ON s.supplier_num = p.supplier_num
) WHERE supplier_cnt > 1;
在这里,我使用COUNT*作为窗口分析函数,而不是聚合函数。在窗口函数的分区中使用part_num将获得每个零件的供应商数量。这确实假设供应商表或零件表中没有重复项。

这里有一种使用exists检查不同供应商的相同零件是否存在的方法

SELECT s.supplier_name, p.part_num
FROM supplier s
JOIN part p ON s.supplier_num = p.supplier_num
WHERE EXISTS (
    SELECT 1 FROM part p2 
    WHERE p2.supplier_num <> p.supplier_num -- different supplier
    AND p2.part_num = p.part_num -- same part
)
这里有一种使用exists检查不同供应商的相同零件是否存在的方法

SELECT s.supplier_name, p.part_num
FROM supplier s
JOIN part p ON s.supplier_num = p.supplier_num
WHERE EXISTS (
    SELECT 1 FROM part p2 
    WHERE p2.supplier_num <> p.supplier_num -- different supplier
    AND p2.part_num = p.part_num -- same part
)

嗯,使用这个似乎没有什么效果。你知道为什么吗?那么没有超过1个不同供应商的零件NUM。如果你发布一些样本数据和预期输出,这也会有所帮助。嗯,似乎使用它没有给我任何结果。你知道为什么吗?那么没有超过1个不同供应商的零件NUM。如果您发布一些示例数据和预期输出,这也会有所帮助。如果COUNTp.part_num大于1,我会感到惊讶,因为您同时对供应商名称和part_num进行分组。事实上,这会向我表明,您的供应商表中的供应商名称具有非唯一值,或者可能具有非唯一值零件表中供应商编号/零件编号的组合。如果COUNTp.part编号大于1,我会感到惊讶,因为您在供应商名称和零件编号上进行分组。事实上,这会向我表明,您的供应商表中供应商名称的值不唯一,或者可能是以下组合的值不唯一零件表中的供应商编号/零件编号。