danielnewman
@danielnewman
Front-end

Как превратить WHERE в JOIN?

Есть не работающий из-за вложенности SELECT:
SELECT
    sum(Acheck."TOTAL") AS SUMM,
    strftime('%Y - %m', LOGICDATE) AS YearMonth
FROM 
    Acheck
WHERE Acheck.SYS_NUM IN (
    SELECT 
        ARcheck.SYS_NUM
    FROM
        ARcheck
    WHERE
        ARcheck.SIFR IN (
            SELECT 
                Menu.SIRF AS MenuSIRF, 
                Menu.Name AS MenuName,
                Categ.SIRF
            FROM
                Menu Join Categ on Menu.CATEG = Categ.SIRF
            WHERE (Categ.SIRF = 2)
    )
)
GROUP BY strftime('%Y %m', LOGICDATE);


Пытаюсь перебить его на JOIN:
SELECT 
   sum(AC."TOTAL") AS SUME,
   strftime('%Y - %m', AC.LOGICDATE) AS LOGICDATE
FROM
    Menu 
    JOIN Categ
        ON Menu.CATEG = Categ.SIRF
        AND Categ.SIRF = 2
    JOIN ARcheck AR
        ON AR.SIFR = Menu.SIRF
    JOIN Acheck AC
        ON AC.SYS_NUM = AR.SYS_NUM

GROUP BY strftime('%Y %m', AC.LOGICDATE);


Ничего не выходит. Где я не прав?

sqlfiddle.com/#!5/50a93/2
  • Вопрос задан
  • 2265 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Первый вариант у Вас не работает не из-за вложенности, а из-за того, что в SELECTE выбираете три колонки, а потом этот SELECT пытаетесь использовать в IN, где допускается только одна колонка.
Вариант с JOIN можно сделать по разному, например так:
SELECT sum(`Acheck`.`TOTAL`) AS `SUME`,
       strftime('%Y - %m', `Acheck`.`LOGICDATE`) AS `LOGICDATE`
  FROM `Categ`
    JOIN `Menu` ON `Categ`.`SIRF` = `Menu`.`Categ`
    JOIN `ARcheck` ON `Menu`.`SIRF` = `ARcheck`.`SIFR`
    JOIN `Acheck` ON `ARcheck`.`SYS_NUM` = `Acheck`.`SYS_NUM`
  WHERE `Categ`.`SIRF` = 2
  GROUP BY `LOGICDATE`

Или так:
SELECT sum(`Acheck`.`TOTAL`) AS `SUME`,
       strftime('%Y - %m', `Acheck`.`LOGICDATE`) AS `LOGICDATE`
  FROM `Acheck`
    JOIN `ARcheck` ON `ARcheck`.`SYS_NUM` = `Acheck`.`SYS_NUM`
    JOIN `Menu` ON `Menu`.`SIRF` = `ARcheck`.`SIFR`
    JOIN `Categ` ON `Categ`.`SIRF` = `Menu`.`Categ`
  WHERE `Categ`.`SIRF` = 2
  GROUP BY `LOGICDATE`

В любом случае, на данных в sqlfiddle для `Categ`.`SIRF` = 2 будет пустой результат.
(`Categ`.`SIRF` = 2) => (`Menu`.`SIRF` = 4) => ни одной строки из `ARcheck`
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы