ПРИСОЕДИНЯЙТЕСЬ, используя IN с подзапросом - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь выполнить объединение, используя подзапрос с IN, но я получаю ошибку «Оператор сравнения IN недействителен»

Есть ли способ преодолеть это?

Здесьмой sql, который не работает:

    SELECT
    SIZE,
    COUNT(SIZE)

FROM
  (SELECT ITEM,
        MIN(SZCUBC) AS CUBE
        FROM XXX.ITEM 
        JOIN XXX.ITEMA ON IAITEM = ITEM 
        LEFT JOIN DB.SIZECD ON ITDHGT*ITDWTH*ITDDTH*QTY <= SZCUBC AND SIZE IN (SELECT SIZEB FROM DB.LOC WHERE BQTY>0 GROUP BY SIZEB) 
        WHERE IASOHQ >0 
        GROUP BY ITEM) t

LEFT JOIN DB.SIZECD T1 ON SZCUBC = CUBE 

GROUP BY
    SIZE

Я использовал ниже, который работает, но не динамический ...

    SELECT
    SIZE,
    COUNT(SIZE)

FROM
  (SELECT ITEM,
        MIN(SZCUBC) AS CUBE
        FROM XXX.ITEM 
        JOIN XXX.ITEMA ON IAITEM = ITEM 
        LEFT JOIN DB.SIZECD ON ITDHGT*ITDWTH*ITDDTH*QTY <= SZCUBC AND SIZE IN ('TA','TB','TC','TD','TE','TF') 
        WHERE IASOHQ >0 
        GROUP BY ITEM) t

LEFT JOIN DB.SIZECD T1 ON SZCUBC = CUBE 

GROUP BY
    SIZE

Ответы [ 3 ]

1 голос
/ 07 ноября 2019

По DB2 документы при возможной связанной ошибке:

Предложение ON не может содержать подзапрос.

Поэтому рассмотрим WHEREзамена:

...
  (SELECT ITEM,
        MIN(SZCUBC) AS CUBE
   FROM XXX.ITEM 
   JOIN XXX.ITEMA ON IAITEM = ITEM 
   LEFT JOIN DB.SIZECD ON ITDHGT*ITDWTH*ITDDTH*QTY <= SZCUBC
   WHERE IASOHQ > 0 
     AND SIZE IN (SELECT SIZEB 
                  FROM DB.LOC 
                  WHERE BQTY > 0) 
   GROUP BY ITEM) t
1 голос
/ 08 ноября 2019

Предполагая, что SIZE принадлежит DB.SIZECD.

LEFT JOIN 
(
DB.SIZECD C  
JOIN (SELECT SIZEB FROM DB.LOC WHERE BQTY>0 GROUP BY SIZEB) G ON G.SIZEB = C.SIZE
) ON ITDHGT*ITDWTH*ITDDTH*QTY <= SZCUBC

Вместо:

LEFT JOIN DB.SIZECD ON ITDHGT*ITDWTH*ITDDTH*QTY <= SZCUBC AND SIZE IN 
(SELECT SIZEB FROM DB.LOC WHERE BQTY>0 GROUP BY SIZEB)

Мы не можем переместить подвыбор с помощью DB.LOC за пределы LEFT JOIN сохранить логику.

1 голос
/ 07 ноября 2019

Вы можете попробовать заменить предложение IN предложением JOIN

(и я удалил группу без функции агрегирования в подзапросе с отдельным предложением)

    SELECT
    SIZE,
    COUNT(SIZE)
FROM
  ( SELECT ITEM,
        MIN(SZCUBC) AS CUBE
        FROM XXX.ITEM 
        JOIN XXX.ITEMA ON IAITEM = ITEM 
        JOIN  (
          SELECT DISTINCT SIZEB 
          FROM DB.LOC 
          WHERE BQTY>0
        ) t2 ON t2.SIZEB = DB.SIZECD.SIZE
        LEFT JOIN DB.SIZECD ON ITDHGT*ITDWTH*ITDDTH*QTY <= SZCUBC 
        WHERE IASOHQ >0 
        GROUP BY ITEM
        ) t
LEFT JOIN DB.SIZECD T1 ON SZCUBC = CUBE 

GROUP BY  SIZE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...