Может любой помогать мне с SQL-запросом в Derby Apache SQL получить "простое" количество.
Учитывая таблицу ABC, которая похожа на это...
id a b c 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
Как я могу записать запрос для получения количества того, как может отличные значения и (b=1 и c=2) И (b=2 и c=1) для получения корректного результата 1. (эти две строки отметили, соответствуют критериям, и у обоих есть значение a=2, существует только 1 отличное значение в этой таблице, которые соответствуют критериям),
Хитрый бит - это (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) никакие не идут как взаимоисключающие
С наилучшими пожеланиями, Phil.
Я предполагаю, что (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)
Альтернативный способ, который может быть проще для понимания, - использовать подзапрос:
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, но я надеюсь, что они там тоже будут работать.
Сложность заключается в том, что (b = 1 и c = 2) AND (b = 2 и c = 1), очевидно, являются взаимоисключающими при применении к однорядный
Именно так. Когда вы думаете о наборе записей, вам нужно количество различных значений «a» для строк, где (b = 1 и c = 2)
OR
(b = 2 и c = 1)
. Попробуйте следующее:
SELECT COUNT(DISTINCT a) FROM "abc" WHERE (b=1 OR c=2) OR (b=2 OR c=1)
Второй запрос Марка действительно должен поддерживаться Apache Derby, согласно странице поддержки SQL 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.