如果SQL的1行值为true,则选择所有匹配的行

时间:2018-02-14 20:22:07

标签: sql sql-server subquery

我是SQL的新手,所以我不确定在搜索时是否使用了正确的术语,但我想这已经被问过了。如果没有,我们走了。

参加示例表:

Cart    Item    Packer
Cart 1  Bananas Bob
Cart 1  Coffee  Bob
Cart 1  Pizza   Bob
Cart 2  Apples  Bob
Cart 2  Peaches Bob
Cart 2  Berries Bob
Cart 1  Soda    James
Cart 1  Bread   James

然后我想知道咖啡是否被放入购物车中,包装商放入购物车的所有东西都是这样的:

Cart 1  Bananas Bob
Cart 1  Coffee  Bob
Cart 1  Pizza   Bob

我曾尝试过如下查询:

select cart, item, packer
from table
where packer in (select packer from table where item = 'Coffee')

但是我通常最终得到了购物车2的结果,因为,我想,当查询查找购物车2并且鲍勃显示有包装咖啡时,它会选择该结果。 然后当我用子车#替换子查询中的打包器时,我也得到了詹姆斯的结果。我甚至在子查询中尝试了子查询,如:

    where packer (in select packer from table where item in(select item 
from table where item = 'Coffee'))

我无法弄清楚如何隔离装有咖啡的购物车1包装工的结果。

4 个答案:

答案 0 :(得分:2)

您可以使用匹配购物车和包装商条件的exists来执行此操作。

select cart, item, packer
from table t1
where exists (select 1 
              from table t2
              where t1.cart=t2.cart and t1.packer=t2.packer and t2.item = 'Coffee')

答案 1 :(得分:0)

select p1.* 
from packer p1 
join packer p2 
  on p2.packer = p1.packer 
 and p2.cart   = p1.cart 
 and p2.item   = 'Coffee'

答案 2 :(得分:0)

Vamsi的回答是正确的,也是最普遍的(我已经赞成了)。但是,某些数据库支持带有元组的in,因此可以扩展您的方法。

关键是您需要配对cart / packer

select cart, item, packer
from table
where (cart, packer) in (select cart, packer from table where item = 'Coffee');

这是你正在做的最接近的版本。

答案 3 :(得分:0)

或者,您可以使用子查询,最终可能更容易设置和调试:

set @itemSearch = "coffee"; -- variable to make the query more easy to change

SELECT t.cart, t.item, t.packer
  FROM (SELECT cart, packer
           FROM TABLE_1
           WHERE item = @itemSearch
  ) AS sub1
  INNER JOIN TABLE_1 t ON ((sub1.cart = t.cart) AND 
                           (sub1.packer = t.packer))

here是我用这个例子做的SQL Fiddle的链接。我添加了一行咖啡,以显示如果有两个带咖啡的推车,此查询将起作用。