2017-02-21 3 views
0

Чтобы использовать этот запрос в качестве подзапроса, проблема в том, что он возвращает много строк дубликатов. Пытался использовать COUNT() вместо существующего, но он все равно возвращает несколько ответов. Каждая таблица может содержать только одну запись superRef.sql function case возвращает более одной строки

Ниже запрос I`ll использовать в SELECT, col_a [случае] От MyTable

SELECT CASE 
     WHEN 
     EXISTS (SELECT 1 FROM A WHERE 
      A_superRef = myTable.sysno AND A_specAttr = 'value') 
     THEN 3 
     WHEN  EXISTS (SELECT 1 FROM B 
      INNER JOIN С ON С_ReferenceForB = B_sysNo WHERE C_superRef = myTable.sysno AND b_type = 2) 
     THEN 2 
     ELSE (SELECT C_intType FROM C 
      WHERE C_superRef = myTable.sysno) 
     END 
    FROM A, B, C 

результат:

3 
3 
3 
3 
3 
3... 
+4

Нет условий соединения? Возможно, вы хотите СОЮЗ? Добавьте некоторые примеры данных таблицы и ожидаемый результат - также форматированный текст. – jarlh

+0

Вы сами запускаете подзапросы? что они возвращают? – jambonick

+0

Это крест. С 1000 записей за стол вы получаете 1 миллиард комбинаций. И для каждой строки этих многих записей вы снова запрашиваете таблицы - без какой-либо ссылки на соответствующую запись. Это, конечно, не то, что вам нужно. Так что же это вместо этого? Чего вы хотите достичь? –

ответ

0

DUAL является то, что мне было нужно, благодаря Thorsten Kettner

SELECT CASE 
    WHEN 
    EXISTS (SELECT 1 FROM A WHERE 
     A_superRef = 1000001838012) 
    THEN 3 
    WHEN  EXISTS (SELECT 1 FROM B 
     INNER JOIN С ON С_ReferenceForB = B_sysNo AND C_superRef = 1000001838012) 
    THEN 2 
    ELSE (SELECT C_type FROM C 
     WHERE C_superRef = 1000001838012) 
    END 
FROM DUAL 
1

Что делать, если вы сделали это? Поскольку Im догадывается, что вы получаете неявное полное внешнее соединение A X B X C, затем запускаете оператор case для каждой строки в этом наборе результатов.

SELECT CASE 
    WHEN 
    EXISTS (SELECT 1 FROM A WHERE 
     A_superRef = 1000001838012) 
    THEN 3 
    WHEN  EXISTS (SELECT 1 FROM B 
     INNER JOIN С ON С_ReferenceForB = B_sysNo AND C_superRef = 1000001838012) 
    THEN 2 
    ELSE (SELECT C_type FROM C 
     WHERE C_superRef = 1000001838012) 
    END 
FROM (SELECT COUNT(*) FROM A) --This is a hack but should work in ANSI sql. 
           --Your milage my vary with different RDBMS flavors. 
+0

хорошо это работает! magic =), но следует ли использовать точно таблицу A? И в соответствии с планом выполнения это также дает лучшую производительность ... И работает во всех случаях –

+1

Er, если вы хотите выбрать одну псевдо-строку, выберите «dual». Это сделано именно для этой цели. (В других СУБД вместо этого вы опускаете предложение 'from', но Oracle требует этого и придумала« двойную »по этой причине.) Не нужно« взломать ». (Ваше решение даже читает всю таблицу A совершенно без необходимости.) –

+1

Запрос OP не является «полным внешним соединением», кстати (который все равно будет присоединяться к критериям), но перекрестное соединение, ведущее к декартовому произведению. –

Смежные вопросы