MySQL嵌套查询不会运行,在SQL Server上运行

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和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中也遇到过这种错误。我在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 };