以下SQL insert语句适用于Microsoft SQL Server,但不适用于MySQL

以下SQL insert语句适用于Microsoft SQL Server,但不适用于MySQL,mysql,sql-server,Mysql,Sql Server,我是MySQL新手,正在尝试将Microsoft SQL Server中的代码转换为MySQL。下面的SELECT语句在MySQL中有效,但在INSERT INTO中无效。对于使用聚合语句AVG for MySQL的INSERT INTO,是否有不同的格式 -- Adding data to the Health Data Baseline table INSERT INTO Health_Data_Baseline ( Total_Sleep_Duration_Baseline

我是MySQL新手,正在尝试将Microsoft SQL Server中的代码转换为MySQL。下面的SELECT语句在MySQL中有效,但在INSERT INTO中无效。对于使用聚合语句AVG for MySQL的INSERT INTO,是否有不同的格式

-- Adding data to the Health Data Baseline table

INSERT INTO Health_Data_Baseline (
    Total_Sleep_Duration_Baseline
    ,Body_Weight_Baseline
    ,Body_Mass_Index_Baseline
    ,Body_Fat_Percentage_Baseline
    ,Step_Count_Baseline
    ,Flights_Climbed_Baseline
    ,Health_Data.Person_Device_ID)
SELECT 
    AVG(Total_Sleep_Duration) -- as "Average Minutes of Sleep Per Night"
    ,AVG(Body_Weight) -- as "Average Weight in Pounds"
    ,AVG(Body_Mass_Index) -- as "Average Body Mass Index"
    ,AVG(Body_Fat_Percentage) -- as "Average Body Fat %"
    ,AVG(Step_Count) -- as "Average Step Count"
    ,AVG(Flights_Climbed) -- as "Average Flights Climbed"
    ,Health_Data.Person_Device_ID
FROM Health_Data 
JOIN Person_Device ON Person_Device.Person_Device_ID = Health_Data.Person_Device_ID
GROUP BY Health_Data.Person_Device_ID

INSERT语句中有一个微妙的错误;去掉其他列使其更加明显,您有:

INSERT INTO Health_Data_Baseline (
    Health_Data.Person_Device_ID
)
SELECT 
    Health_Data.Person_Device_ID
FROM Health_Data 
GROUP BY Health_Data.Person_Device_ID
第一个Health\u Data.Person\u Device\u ID应该只指定目标表Health\u Data\u基线中的Person\u Device\u ID列。用表名限定它是没有意义的

出于某种原因,SQL Server会忽略此前缀-实际上,您可以将INSERT写入健康状况\数据\基线完成状态,这意味着没有任何东西。人员\设备\ ID-但其他DBMS会将其视为无效语法而拒绝

换句话说,只需将其更改为:

INSERT INTO Health_Data_Baseline (
    Person_Device_ID
)
SELECT 
    Health_Data.Person_Device_ID
FROM Health_Data 
GROUP BY Health_Data.Person_Device_ID
应该是

INSERT INTO Health_Data_Baseline (
    Total_Sleep_Duration_Baseline
    ,Body_Weight_Baseline
    ,Body_Mass_Index_Baseline
    ,Body_Fat_Percentage_Baseline
    ,Step_Count_Baseline
    ,Flights_Climbed_Baseline
    ,Person_Device_ID)
上面,您正在指示要插入的健康数据基线的哪些字段,但是,我怀疑您是否有一个名为

Health_Data_Baseline.Health_Data.Person_Device_ID 

MYSQL版本的代码需要方括号,因为在列中插入了中提到的格式,因为它对键入不太友好: i、 e

挑选 平均总睡眠时间-每晚平均睡眠分钟数 ,平均体重-以磅为单位的平均体重 ,平均体重指数-作为平均体重指数 ,平均体脂百分比-作为平均体脂% ,AVGStep_Count-作为平均步长计数 ,平均飞行时间上升,平均飞行时间上升 ,健康\u数据。人员\u设备\u ID 从健康数据 在Person\u设备上加入Person\u设备。Person\u设备\u ID=健康\u数据。Person\u设备\u ID
按健康数据分组。Person\u Device\u ID

给我们一条错误消息健康数据基线表中此列的健康数据。Person\u Device\u ID似乎有问题。我已经编辑了您的帖子并格式化了您的查询,以使其更加明显。您确定这在sql server中有效吗?最后一列是Health_Data.Person_Device_ID,我几乎可以肯定这在sql server中会失败。正如@SeanLange所指出的,如果您的列名中有句点,并且没有包含其他格式,如[Health_Data.Person_Device_ID]之类的方括号,这将在sql server中引发错误。@JacobH我假设是这样,也一样,但我只是试了一下。事实上,你可以在考试前写一些毫无意义的东西。SQL Server将忽略它并插入到列中。e、 g.创建表FOO ID INT;插入FOO nonsensethattwillbeignored.ID值42;从中选择*检查现有答案和评论;如果列实际上有一个引号,SQL Server也需要某种类型的引号。当然,我看到了你的答案,但出于应有的尊重,它并不清楚,也不详细,所以我写下了我的答案,并提出了完整的问题,以方便提问者和读者。为什么告诉我我没有说。在SQL Server中工作,您自己的答案中会引用它。如果该列的名称实际上是Health_Data.Person_Device_ID,则如果不添加[and],给定的查询将无法在Microsoft SQL Server中工作,如您所示。因为问题是它在SQL Server中确实工作,所以我们知道这不是问题所在。问题是该列实际上被称为Person\u Device\u ID,但insert语句有一个错误,出于某种原因,SQL Server会忽略该错误。
INSERT INTO Health_Data_Baseline (
Total_Sleep_Duration_Baseline
,Body_Weight_Baseline
,Body_Mass_Index_Baseline
,Body_Fat_Percentage_Baseline
,Step_Count_Baseline
,Flights_Climbed_Baseline
,[Health_Data.Person_Device_ID])