0

我需要从包含产品 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")
4

1 回答 1

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'

但这不太容易推广到nprod_codes。

于 2012-06-22T10:32:14.223 回答