5

任何人都可以帮助我在 Apache Derby SQL 中进行 SQL 查询以获得“简单”计数。

给定一个看起来像这样的表 ABC...

    
    美国广播公司
    1 1 1 1
    2 1 1 2
    3 2 1 3
    4 2 1 1
** 5 2 1 2 **
** 6 2 2 1 **
    7 3 1 2
    8 3 1 3
    9 3 1 1

如何编写查询来计算“a”的不同值如何同时具有(b=1 和 c=2)和(b=2 和 c=1)以获得正确的结果 1。(标记的两行与条件匹配并且都具有 a=2 的值,此表中只有 1 个不同的 a 值与条件匹配)

棘手的一点是,(b=1 and c=2) AND (b=2 and c=1)当应用于单行时,它们显然是互斥的。.. 那么如何将该表达式应用于 a 的多行不同值?

这些查询是错误的,但为了说明我正在尝试做的事情......
SELECT DISTINCT COUNT(a) WHERE b=1 AND c=2 AND b=2 AND c=1 ...
(0)不能互斥
SELECT DISTINCT COUNT(a) WHERE b=1 AND c=2 OR b=2 AND c=1 ...
......(3)让我得到错误的结果。
SELECT COUNT(a) (CASE WHEN b=1 AND c=10 THEN 1 END) FROM ABC WHERE b=2 AND c=1
.. (0) 不能互斥

干杯,菲尔。

4

3 回答 3

7

我假设 (a,b,c) 是唯一的。一种方法是使用自联接:

SELECT COUNT(*)
FROM   ABC T1
JOIN   ABC T2
ON     T1.a = T2.a
WHERE  T1.b = 1 AND T1.c = 2
AND    T2.b = 2 AND T2.c = 1

这在概念上的工作原理如下:

  • 找到所有满足的行(b,c) = (1,2)
  • 找到所有满足的行(b,c) = (2,1)
  • 当 a 相同时加入上述两组。
  • 计算连接结果中的行数。

另一种可能更容易理解的方法是使用子选择:

SELECT COUNT(*)
FROM   ABC
WHERE  a IN (SELECT a FROM ABC
             WHERE  b = 2
             AND    c = 1)
AND    b = 1
AND    c = 2

注意:如果 (a,b,c) 的值可能重复,则不要在第一个查询和第二个查询中SELECT COUNT(*)使用。SELECT COUNT(DISTINCT T1.a)SELECT COUNT(DISTINCT a)

这些查询是在 MySQL 而不是 Apache Derby 中测试的,但我希望它们也能在那里工作。

于 2010-05-16T22:13:26.700 回答
1

根据Apache Derby 的 SQL 支持页面,Mark 的第二个查询确实应该得到Apache Derby 的支持。

SELECT COUNT(DISTINCT a) FROM ABC
 WHERE b = 1 AND c = 2
   AND a IN (SELECT a FROM ABC WHERE b = 2 AND c = 1);

除了比自连接版本更易于阅读之外,它还应该更快,因为您避免了必须执行 JOIN 的开销。

于 2010-05-17T00:42:09.633 回答
0

棘手的一点是 (b=1 and c=2) AND (b=2 and c=1) 在应用于单行时显然是互斥的

正是如此。在考虑记录时,您需要其中行的不同“a”值的数量。尝试这个:(b = 1 and c = 2) OR (b = 2 and c = 1)

SELECT COUNT(DISTINCT a) FROM "abc" WHERE (b=1 OR c=2) OR (b=2 OR c=1)
于 2010-05-17T00:06:12.887 回答