Проблема преобразования Access SQL Inner Join Query в MySQL Query - PullRequest
0 голосов
/ 01 октября 2019

У меня возникла проблема с обнаружением синтаксической проблемы, которая приводит к тому, что следующий запрос не дает результатов:

SELECT Table1.Country, Table_Data2.Part, Table_Data2.Description, Sum(Table_Data2.Quantity) AS Quantity, Table1.ship_time
FROM Table1 INNER JOIN Table_Data2 ON Table1.CodeValue = Table_Data2.CodeValue
GROUP BY Table1.Country, Table_Data2.Part, Table_Data2.Description, Table1.ship_time
HAVING (((Table_Data2.Part)="BB1234" Or (Table_Data2.Part)="BB-3454") AND ((Table1.ship_time)=Date()));

Что должно успешно привести к таблице, которая выглядит следующим образом:

Пример того, как должен выглядеть результат

Вместо этого не возникает никаких проблем с синтаксисом и нет записей, которые загружаются.

Кажется, в коде есть проблема с синтаксисомвыше, так как он не работает в MySQL, как в MS Access

1 Ответ

1 голос
/ 01 октября 2019

Возможно несколько исправлений:

  • Чтобы получить текущую дату в MySQL, используйте Current_Date(). Функция Date() в MySQL имеет другое поведение, поскольку она используется для извлечения части даты из выражения даты (времени).

  • Скобки вокруг только имен полей не нужны. Используйте псевдонимы в многотабличном запросе для ясности кода и способности к чтению.

  • Кроме того, если посмотреть на ваши условия в предложении Have, они больше подходят для использования в предложении Where. Потому что они не являются агрегированными значениями, и вы также группируете по этим же полям. Ваш запрос станет более производительным, если вы перенесете их в предложение Where, поскольку MySQL будет агрегировать отфильтрованные (сокращенные) данные и, таким образом, минимизировать временное табличное пространство.

  • Также вы можете переписатьнесколько OR условий на том же поле, что и IN(...)

Вы можете переписать как:

SELECT 
  t1.Country, 
  t2.Part, 
  t2.Description, 
  Sum(t2.Quantity) AS Quantity, 
  t1.ship_time
FROM Table1 AS t1
INNER JOIN Table_Data2 AS t2
  ON t1.CodeValue = t2.CodeValue
WHERE 
  t2.Part IN ('BB1234', 'BB-3454')
  AND t1.ship_time = Current_Date()
GROUP BY 
  t1.Country,
  t2.Part,
  t2.Description,
  t1.ship_time  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...