MySQL嵌套查询不会运行,在SQL Server上运行
我在MySQL和SQLServer上运行多个查询在两台服务器上运行相同的查询,相同的数据库。几乎所有的车都跑得很好。我对这个有一个问题: 选择 `Extent1`.`IdGosc`, `extend2`.`Imie`, `延伸2`.`纳兹维斯科` 从“TGosc”改为“Extent1”` 内部连接`TOsoba`为`Extent1`上的`Extent2`.`IdGosc`=`Extent2`.`IdOsoba`` 哪里有 选择1作为'C1'` 从…起 选择“Extent3”。`IdRezerwacja` 从'TRezerwacja'到'extend3` 在这里其中`Extent1`.`IdGosc`=`Extent3`.`IdGosc`AS`Project1` 它在SQL Server上运行正常,返回正确的结果,但MySQL说: 错误代码:1054。“where子句”中的未知列“Extent1.IdGosc” 为什么会这样| MySQL嵌套查询有什么限制吗MySQL嵌套查询不会运行,在SQL Server上运行,mysql,sql,sql-server,nested,Mysql,Sql,Sql Server,Nested,我在MySQL和SQLServer上运行多个查询在两台服务器上运行相同的查询,相同的数据库。几乎所有的车都跑得很好。我对这个有一个问题: 选择 `Extent1`.`IdGosc`, `extend2`.`Imie`, `延伸2`.`纳兹维斯科` 从“TGosc”改为“Extent1”` 内部连接`TOsoba`为`Extent1`上的`Extent2`.`IdGosc`=`Extent2`.`IdOsoba`` 哪里有 选择1作为'C1'` 从…起 选择“Extent3”。`IdRezerwa
请不要提供返回相同结果的查询,我也可以这样做,但这不是我的观点,我在mysql中也遇到过这种错误。我在tht tym所做的是: mysql只记住当前表,所以尝试这样做可能b它会工作 替换
FROM `TRezerwacja` AS `Extent3
与
我在MySQL上看到过这个问题
SELECT `Extent1`.`IdGosc`, `Extent2`.`Imie`, `Extent2`.`Nazwisko`
FROM `TGosc` `Extent1` INNER JOIN
`TOsoba` `Extent2`
ON `Extent1`.`IdGosc` = `Extent2`.`IdOsoba`
WHERE EXISTS (SELECT `Extent3`.`IdRezerwacja`
FROM `TRezerwacja` AS `Extent3`
(here!) WHERE `Extent1`.`IdGosc` = `Extent3`.`IdGosc`
)
幸运的是,在这种情况下,您可以删除中间的子查询。好的。这就是MySQL的问题所在。 我使用的是实体框架的查询,该查询稍后会转换为特定于数据库的SQL。我喜欢这个案子。因此,EF中的查询是:
var query3a = from TGosc gosc in context.TGosc
where gosc.TRezerwacja
.Any(x => x.TPlatnosc
.Any(y => y.Kwota > 100000))
select new { gosc.IdGosc, gosc.TOsoba.Imie, gosc.TOsoba.Nazwisko };
现在,我的应用程序中的提供商是Connector NET 6.7.4。它包括MySQL.Data和MySQL.Data.Entities,都在版本6.7.4中
然而,我还安装了MySQL for Visual Studio 1.0.2,以便能够使用比Visual Studio中的代码更多的GUI。但这件事与相同的DLL,只是在不同的旧版本6.6.5。当应用程序运行时,这些优先于较新的。首先,奇怪的是,在同一个MySQL安装程序中,同一DLL有两个相互冲突的版本
无论如何,我删除了Visual Studio 1.0.2的MySQL,这给我留下了较新的DLL,并查看在将同一个LINQ to Entities查询转换为db sql时会发生什么:
-旧版本6.6.5
选择
extend1.IdGosc,
扩展2.Imie,
纳兹维斯科酒店
从TGosc作为Extent1
将TOsoba作为Extent1.IdGosc=Extent2.IdOsoba上的Extent2进行内部连接
哪里有
选择1作为C1
从…起
选择Extent3.IdRezerwacja
从TRezerwacja作为Extent3
其中Extent1.IdGosc=Extent3.IdGosc作为项目1
哪里有
选择1作为C1
来自TPlatnosc,作为扩展4
其中Project1.IdRezerwacja=extend4.IdRezerwacja
和扩展4.Kwota>100000
vs
-新6.7.4
选择
extend1.IdGosc,
扩展2.Imie,
纳兹维斯科酒店
从TGosc作为Extent1
将TOsoba作为Extent1.IdGosc=Extent2.IdOsoba上的Extent2进行内部连接
哪里有
选择1作为C1
来自TRezerwacja的项目1
哪里有
选择1作为C1
来自TPlatnosc,作为扩展4
其中Project1.IdRezerwacja=extend4.IdRezerwacja
和扩展4.Kwota>100000
而extend1.IdGosc=Project1.IdGosc
这与Gordon Linoff在本文中的回答类似。中间的子查询消失了。
当然,新的查询工作得很好
总而言之,我想.NET的MySQL提供程序比这些版本更好。我仍然有一些问题,导致类似的问题,但现在我想我知道为什么是-供应商。我同意
恼人的是MySQL安装程序中有两个不同版本的DLL,一个覆盖另一个。我使用的是mysql-installer-community-5.6.13.0。不幸的是,这会产生不同的结果。SELECT Extent3.IdRezerwacja子查询将在整个TGosc表上运行,而不是通过加入TOsoba将其简化为上层子查询。顺便说一句,创建查询的不是我。这是实体框架,没错,这是MySQL的问题。我在下面发布了更详细的答案。
var query3a = from TGosc gosc in context.TGosc
where gosc.TRezerwacja
.Any(x => x.TPlatnosc
.Any(y => y.Kwota > 100000))
select new { gosc.IdGosc, gosc.TOsoba.Imie, gosc.TOsoba.Nazwisko };