在SQL列中查找不同的结果

时间:2014-06-09 09:57:28

标签: sql

以下是必要的信息。

表:Parts

pid, Color

表:Supplier

sid, sname

表:Catalog

pid, sid

我正在尝试在具有多个不同供应商的部分中找到pid。我真的不知道用什么命令来做这件事。 我知道我将不得不使用INNER JOIN连接零件和供应商,但是什么命令确保我只得到有多个不同供应商的pid?

如何找到没有供应商的零件?我知道DISTINCT或COUNT可以以某种方式使用但不确定这是如何工作的。

3 个答案:

答案 0 :(得分:1)

查找超过1个供应商的零件:

SELECT
    p.Color
    ,COUNT(DISTINCT s.sname) as nbrSupName
FROM
    Parts p
    INNER JOIN Catalog c
        ON c.pid = p.pid
    INNER JOIN Supplier s 
        ON s.sid = c.sid
GROUP BY
    p.Color
HAVING
    COUNT(DISTINCT s.sname) > 1

或者:

SELECT
    p.Color
    ,s.sname
FROM
    (SELECT
        p.pid
        ,COUNT(DISTINCT s.sname) as nbrSupName
    FROM
        Parts p
        INNER JOIN Catalog c
            ON c.pid = p.pid
        INNER JOIN Supplier s 
            ON s.sid = c.sid
    GROUP BY
        p.Color) subquery
    INNER JOIN Catalog c
            ON c.pid = subquery.pid
    INNER JOIN Supplier s 
        ON s.sid = c.sid
GROUP BY
    p.Color
    ,s.sname
WHERE
    subquery.nbrSupName > 1

查找没有供应商的零件:

SELECT
    p.Color
FROM
    Parts p
    LEFT JOIN Catalog c
        ON c.pid = p.pid
WHERE 
    c.sid IS NULL
GROUP BY
    p.Color

您还可以将第一个查询与COUNT(DISTINCT s.sname) = 0

一起使用

答案 1 :(得分:0)

这应该有效:

select * from parts
where pid in
(select pid
 from catalog
 group by pid
 having count(distinct sid) > 1)

由于您已经有一个将pid映射到一个或多个sid的表,您只需检索该表中具有多个sid值的记录,并使用{{1实现此过滤器的子句。

对于没有HAVING值映射到的pid值,请执行sid,如下所示:

left join

select * from parts p left join catalog c on p.pid = c.pid where c.sid is null 检查确保仅检索is null表中没有映射pid的{​​{1}}个值。

答案 2 :(得分:0)

如果您只需要pid,则可以使用Catalog表

SELECT pid
FROM   Catalog
GROUP BY pid
HAVING COUNT(sid) > 1

仅在供应商由sid而非名称识别时才有效。

让没有供应商的零件依赖于如何存储该信息 如果您的目录中的pid带有NULL sid

SELECT pid
FROM   Catalog
WHERE  sid IS NULL

如果零件没有供应商,则目录中没有行

SELECT p.pid
FROM   Parts p
       LEFT JOIN Catalog c on p.pid = c.pid
WHERE  c.pid IS NULL

如果您的数据库可以使用MINUS类型命令,则可以执行此操作

SELECT pid
FROM   Parts
MINUS --EXCEPT in SQLServer 2005+
SELECT pid
FROM   Catalog