Я пытаюсь собрать запрос для приложения Oracle 11g, и у меня возникла проблема.
Я упросту реальный сценарий, чтобы его было легче понять (а также защитить).данные клиента):
- Таблица A является базовой таблицей.У него есть известный идентификатор, который я передаю запросу.
- Для каждой записи в таблице A может быть несколько записей в таблице B. Таблица B содержит интересующее меня значение.
- Для каждой записи в таблице B также может быть несколько записей в таблице C. Таблица C содержит другое интересующее меня значение.
- У меня также есть фрагмент XML, содержащий список значений, которые могут илиможет не совпадать со значениями, представляющими интерес в таблице C.
- Запрос выполняет внешнее соединение с XML, чтобы при наличии совпадающего значения он возвращал значение снова, в противном случае он равен нулю.
То, что я хочу сделать, это вернуть идентификатор, который я передал, количество уникальных значений в B и C, а также количество уникальных (и ненулевых) значений из XMLчасть соединения.
Мой текущий запрос:
SELECT
a.ID
, COUNT(DISTINCT b.VAL) AS B_VAL
, COUNT(DISTINCT c.VAL) AS C_VAL
, COUNT(DISTINCT xml.VAL) AS XML_VAL
FROM a, b, c,
XMLTABLE('/field1/collection/value' passing my_xml_type
COLUMNS VAL VARCHAR2(50) PATH '.') xml
WHERE
a.ID = b.SOME_ID
AND b.OTHER_ID = c.OTHER_ID
AND c.VAL = xml.VAL (+)
Теперь, если вы забудете о подсчете и просто вернете строки, примерный набор результатов может выглядеть примерно так:
ID B_VAL C_VAL XML_VAL
---------------------------------------
X abc 123 123
X abc 456 null
X abc 789 789
X abc 789 789
DESIRED: Теперь, когда я хочу сделать разные подсчеты, я бы хотел, чтобы он вернулся:
ID B_VAL C_VAL XML_VAL
---------------------------------------
X 1 3 2
ACTUAL: Однако, это то, что я получаю, когдаУ меня все они как COUNT (DISTINCT ...):
ID B_VAL C_VAL XML_VAL
---------------------------------------
X 1 1 1
ALTERNATIVE: ... и если я возьму DISTINCT из подсчета, то получу:
ID B_VAL C_VAL XML_VAL
---------------------------------------
X 1 4 3
Почему DISTINCT, кажется, работает только внутри определенного B_VAL, но его удаление заставляет его работать во всех строках, но без учета уникальности?
Есть ли другой способделать это, что не требует репликации всех объединений как подзапрос?Я полностью упустил суть?
(Обратите внимание, я вообще не являюсь разработчиком БД, меня только что вытащили, чтобы помочь, извините, если это простая проблема ... ЯХотя, я искал в Google и просматривал этот сайт для ответов перед публикацией!)
Спасибо.
Я обнаружил, что если я возьму XML-таблицу, соединяющуюся, то подсчитаем разные работыХорошо для B_VAL и C_VAL ... Так что, может быть, странно, как Oracle обрабатывает объединения таблиц XML?