2015-04-02 3 views
0

Это может быть проще объяснить с кодом первого, так что я в настоящее время использовать что-то, что выглядит следующим образом:Многочисленные коррелированные запросы не поддерживаются в Netezza?

'A' in 
    (
     SELECT DISTINCT b.col1 
     FROM table b 
     WHERE b.ky1 = a.ky1 
      AND b.ky2 = a.ky2 
      AND b.group = a.group 
      AND b.rowNum < a.rowNum 
    ) 

в ИНЕКЕ. По сути, я пытаюсь увидеть, является ли значение A в любой точке до строки, заданной внешним запросом. Это работает само по себе. Вопрос в том, когда я добавить следующее к запросу:

OR 
'S' in 
    (
     SELECT DISTINCT b.col1 
     FROM tableb b 
     WHERE b.ky1 = a.ky1 
      AND b.ky2 = a.ky2 
      AND b.group = a.group 
      AND b.rowNum < a.rowNum 
    ) 

Теперь Netezza производит следующее сообщение об ошибке:

ERROR: (2) This form of correlated query is not supported - consider rewriting 

У меня есть ощущение, что единственный способ обойти это будет делать какие-то соединения, но я не совсем уверен, как это сделать, не производя много дубликатов. Какие-либо предложения?

+0

UNION вместо того, чтобы присоединиться? (Не будет никаких дубликатов.) – jarlh

+0

@jarlh: Это предотвратило бы точные дубликаты, но не частичные совпадения (где конкретная запись имеет '' A'' и '' S'' для 'b.col1' в моем случае). – charles

+0

Возможно, будет лучший способ написать этот запрос. Попробуйте задать другой вопрос с образцами данных и желаемыми результатами - описывая, что вы действительно хотите сделать. Если ваш запрос действительно сложный, попробуйте упростить его, чтобы сосредоточиться на этом аспекте. –

ответ

1

Связанные подзапросы в Netezza, начиная с версии 7.2, имеют следующие аспекты использования, как описано в документе here.

Если вы решили использовать связанных подзапросов, имейте в виду следующие ограничения на вид и размещение коррелированных подзапросов:

  • Вы можете использовать коррелированные подзапросы в WHERE положений.
  • Вы можете использовать коррелированные подзапросы во внутренних условиях соединения и с условием равного условия соединения.
  • Вы можете использовать коррелируют подзапросы в смешанных коррелированных выражениях только в следующем виде:

    выражение (corr_columA, corr_columnB, ...) = выражение (local_columnX, local_columnY, ...)

  • Вы не можете использовать коррелированные подзапросы в операциях SET (UNION, INTERSECT, EXCEPT и MINUS).

  • Вы не можете использовать коррелированные подзапросы в агрегатах с предложениями GROUP BY и HAVING.
  • Вы не можете использовать коррелированные подзапросы в предложениях ORed или в выражения CASE/WHEN. ^=== Вы здесь
  • Вы не можете использовать коррелируют подзапросы в списках IN.
  • Вы не можете использовать коррелированные подзапросы в списках SELECT.

Если вы изменили OR на И, вы увидите, что запрос будет запущен. Конечно, это не принесет желаемых результатов.

Возможно, вы сможете переписать это как JOIN, но мне нужно будет увидеть баланс структуры запроса, прежде чем я смогу нанести удар тому, что может быть.

+0

Этого достаточно, чтобы ответить на вопрос. Благодаря! – charles