将 Access SQL 内部联接查询转换为 mySQL 查询的问题

Posted

技术标签:

【中文标题】将 Access SQL 内部联接查询转换为 mySQL 查询的问题【英文标题】:Issue converting Access SQL Inner Join Query to mySQL Query 【发布时间】:2019-10-01 03:04:22 【问题描述】:

我无法找到导致以下查询没有结果的语法问题:

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()));

这应该会成功生成如下所示的表格:

Example of what result should look like

相反,没有出现语法问题,也没有加载任何记录。

上面的代码似乎存在语法问题,因为它在 mysql 中不像在 MS Access 中那样工作

【问题讨论】:

要在 MySQL 中获取当前日期,请使用 Current_Date()Date() MySQL 中的函数有不同的行为 是的,我已经对其进行了调整,但除此之外还有什么突出的吗? 此外,查看Having 子句中的条件,它们更适合在Where 子句中使用。因为它们不是聚合值,并且您也在这些相同的字段上进行分组。如果您将它们转移到 Where 子句,您的查询将变得更加高效 感谢您的帮助,您能把这个放在答案中吗? ship_time转成MySQL后的数据类型是什么? 【参考方案1】:

可能的修正很少:

要在 MySQL 中获取当前日期,请使用 Current_Date()。 MySQL 中的Date() 函数具有不同的行为,因为它用于从日期(时间)表达式中提取日期部分。

仅字段名称的括号是不必要的。在多表查询中使用别名以提高代码清晰度和可读性。

此外,查看 Have 子句中的条件,它们更适合在 Where 子句中使用。因为它们不是聚合值,并且您也在这些相同的字段上进行分组。如果您将它们转移到 Where 子句,您的查询将变得更加高效,因为 MySQL 将聚合过滤(减少)的数据,从而最大限度地减少临时表空间。

此外,您可以在与IN(...) 相同的字段上重写多个OR 条件

你可以改写为:

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  

【讨论】:

以上是关于将 Access SQL 内部联接查询转换为 mySQL 查询的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SQL 中的多个内部联接转换为 LINQ?

Access-SQL:与多个表的内部联接

Access 上的内部联接 SQL

用于 SQL 内部联接的 MS Access 中的括号问题

带有内部联接和子查询的 Microsoft Access 更新语句

如何将带有内连接的 sql 查询转换为 linq lambda 表达式?