1

我有一个基本上执行如下操作的查询:

select a, b, c
from tab
where tab.state = 'A'
minus
select a, b, c
from tab
where tab.state = 'B'

在此示例中ab、 和c是此表的关键字段。state也是键的一部分,我正在尝试查找状态 A 有记录但状态 B 没有记录的情况。我想报告另一个字段(不在键中)value,,对于不同州的相同记录,这可能会有所不同。例子:

abc 状态值
---------------------
1 1 1 12
1 2 2 1002
1 3 9 一个 43
1 1 1 乙 17.34
1 2 2 乙 1002

在这种情况下,我对键是1,3,9状态为 A 的行感兴趣。我也想获取value列的值,但如果我尝试:

select a, b, c, value
from tab
where tab.state = 'A'
minus
select a, b, c, value
from tab
where tab.state = 'B'

我会得到两行:

abc 值
----------------
1 1 1 12
1 3 9 43

基本上,我想value在结果集中有,但不参与minus. 我觉得我在这里遗漏了一些明显的东西,但也许我太累了,无法得到它……;)

4

3 回答 3

3

这样做的明显方法是这样的:

select a, b, c, value
from tab
where tab.state = 'A' and not exists (
  select 1                          -- let the optimizer do its thing
  from tab ti
  where tab.state = 'B' and ti.a=tab.a and ti.b=tab.b and ti.c=tab.c)

如果数据可以有双精度,我什至会distinct在外部查询中添加一个。

于 2011-05-05T19:56:14.540 回答
1

You can join all rows where state = 'A' with the matching ones with state = 'B'...

SELECT t1.a, t1.b, t1.c, t1.value, t2.value v2
FROM (SELECT a, b, c, value FROM tab WHERE state = 'A') t1
     LEFT JOIN (SELECT a, b, c, value FROM tab WHERE state = 'B') t2
            ON t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c

...and then pick the rows where there were no match:

 SELECT a, b, c, value
 FROM ( /* previous query */ )
 WHERE v2 IS NULL
于 2011-05-05T19:58:54.967 回答
0
SELECT a,
  b,
  c,
  value
FROM tab tab1
INNER JOIN
  (SELECT a, b, c FROM tab WHERE tab.state = 'A'
  MINUS
  SELECT a, b, c FROM tab WHERE tab.state = 'B'
  ) tab2
ON tab1.a  = tab2.a
AND tab1.b = tab2.b
AND tab1.c = tab2.c 

我相信上面的代码可以解决问题。

于 2013-11-30T20:13:33.967 回答