返回基于多个记录标准的结果

时间:2012-06-22 10:29:29

标签: sql

我需要从包含产品A和产品B的交易清单中退回发票

表格的例子

prod_code | invoice
 apple    |  100
 banana   |  100
 orange   |  100
 apple    |  101
 kiwi     |  101
 grape    |  101
 apple    |  102
 banana   |  102
 grape    |  102

我需要输入2个产品,并且必须列出包含这两种产品的发票号。 如果我输入苹果和香蕉,它必须返回100和102 如果我输入苹果和葡萄,则返回101和102

看起来应该很简单,但对于我的生活,我无法思考如何做到这一点。

解决

好的,我解决了自己的问题。不知道为什么我之前没有想到它。我觉得这很简单。

select invoice from transaction where prod_code="apple" and invoice in (select invoice from transaction where prod_code="banana")

1 个答案:

答案 0 :(得分:2)

SELECT
  invoice
FROM
  transactions
WHERE
  prod_code IN ('apple', 'banana')
GROUP BY
  invoice
HAVING
  COUNT(DISTINCT prod_code) = 2

但请注意,这不是一个快速查询,并且使用它的结构并不容易获得显着的性能提升。

就其本质而言,第一步必须由find all invoices with 'apple' <OR> 'banana'开始,然后才能过滤到同时具有这两者的发票。

另一种选择是......

SELECT
  t_apple.invoice
FROM
  transactions     AS t_apple
INNER JOIN
  transactions     AS t_banana
    ON t_apple.invoice = t_banana.invoice
WHERE
      t_apple.prod_code  = 'apple'
  AND t_banana.prod_code = 'banana'

但是,将n prod_codes概括为不太简单。