根据需要检查其他行中的常规值的条件选择行

时间:2018-03-20 18:12:43

标签: sql sqlite

我使用SQLite 3在Python中实现这一点。 我有下表'parts',其中包含属性part1,part2和supplier。

part1 part2 supplier
a     j     Foo
b     g     Bar 
c     d     Nom
a     b     Bar
b     k     Bar
c     m     Bar
c     l     Foo

我想选择documentpart1,如果supplier可以从多个供应商处获得(或者只有一个供应商),则独立于part1。 我要找的结果是:

a, Foo
a, Bar
c, Nom
c, Bar
c, Foo

或简单地说,a。 我不想要b,因为它只发生在Bar。

我试过了:

part2

结果是成对的co.execute("SELECT ar.part1,ar.supplier FROM parts ar, parts ts WHERE ar.part1 = ts.part1 AND ar.supplier != ts.supplier ") for row in co.fetchall(): print(row) part1,但只包括2个供应商,表格中有20个。

使用案例的答案暗示说明了特定供应商,例如供应商Bar and Foo或Bar and Nom发生的supplier,但我有20多家供应商。

3 个答案:

答案 0 :(得分:0)

使用分组计算每个零件的供应商数量:

SELECT part1
FROM parts
GROUP BY part1
HAVING COUNT(DISTINCT supplier) >= 2;

答案 1 :(得分:0)

我会使用exists执行此操作:

select p.*
from parts p
where exists (select 1 from parts p2 where p2.part1 = p.part1 and p2.supplier <> p.supplier);

如果您只想要部分列表,那么我会推荐group byhaving。但是你想要完整的行,所以exists更适合你的用例。

答案 2 :(得分:0)

我认为你也可以尝试使用group by和具有以下功能的解决方案:

SELECT ar.part1, ar.supplier
FROM parts ar
WHERE ar.part1 NOT IN
    (SELECT ar.part1
     FROM parts ar
     GROUP BY ar.part1
     HAVING  count(*) = 1)
GROUP BY ar.part1, ar.supplier 
HAVING  count(*) = 1
ORDER BY ar.part1, ar.supplier;