我在MySQL和SQLServer上运行多个查询(两个服务器上的查询相同,同一个数据库)。几乎所有人都运行良好。我有一个问题:
SELECT
`Extent1`.`IdGosc`,
`Extent2`.`Imie`,
`Extent2`.`Nazwisko`
FROM `TGosc` AS `Extent1`
INNER JOIN `TOsoba` AS `Extent2` ON `Extent1`.`IdGosc` = `Extent2`.`IdOsoba`
WHERE EXISTS(
SELECT 1 AS `C1`
FROM (
SELECT `Extent3`.`IdRezerwacja`
FROM `TRezerwacja` AS `Extent3`
(here!) WHERE `Extent1`.`IdGosc` = `Extent3`.`IdGosc`) AS `Project1`
)
它在SQL Server上运行得很好,返回正确的结果,但MySQL说:
错误代码:1054。'where子句'中的未知列'Extent1.IdGosc'。
为什么会这样?:| 有关MySQL嵌套查询的限制吗?
(请不要提供返回相同和工作的查询,我也可以这样做,但这不是我的观点)
答案 0 :(得分:1)
我在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`
)
幸运的是,在这种情况下,您可以删除中间子查询。
答案 1 :(得分:0)
我在mysql中也遇到过这种错误。我在tym做的是: mysql只记得当前表,所以尽量这样做可能会有效
替换
FROM `TRezerwacja` AS `Extent3
与
FROM `TRezerwacja` AS `Extent3`,`TGosc` AS `Extent1`
答案 2 :(得分:0)
确定。事实证明是MySQL的问题。 我正在使用Entity Framework的查询,后来变成了db特定的SQL。我是这种情况下的MySQL。因此,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。
但是,我还为Visual Studio 1.0.2安装了MySQL,以便能够使用比Visual Studio中的代码更多的GUI。但是这个东西带有相同的dll,只是在不同的(较旧的)版本6.6.5中。当应用程序运行时,这些优先于新的。 (首先,在同一个MySQL安装程序中,有两个不同的相同dll的冲突版本,这很奇怪。)
无论如何,我为Visual Studio 1.0.2删除了MySQL,这给我留下了更新的dll,看看当它被转换为db sql时,LINQ to Entities查询会发生什么:
--old 6.6.5
SELECT
Extent1.IdGosc,
Extent2.Imie,
Extent2.Nazwisko
FROM TGosc AS Extent1
INNER JOIN TOsoba AS Extent2 ON Extent1.IdGosc = Extent2.IdOsoba
WHERE EXISTS(
SELECT 1 AS C1
FROM (
SELECT Extent3.IdRezerwacja
FROM TRezerwacja AS Extent3
WHERE Extent1.IdGosc = Extent3.IdGosc) AS Project1
WHERE EXISTS(
SELECT 1 AS C1
FROM TPlatnosc AS Extent4
WHERE (Project1.IdRezerwacja = Extent4.IdRezerwacja)
AND (Extent4.Kwota > 100000)))
VS
-- new 6.7.4
SELECT
Extent1.IdGosc,
Extent2.Imie,
Extent2.Nazwisko
FROM TGosc AS Extent1
INNER JOIN TOsoba AS Extent2 ON Extent1.IdGosc = Extent2.IdOsoba
WHERE EXISTS(
SELECT 1 AS C1
FROM TRezerwacja AS Project1
WHERE EXISTS(
SELECT 1 AS C1
FROM TPlatnosc AS Extent4
WHERE (Project1.IdRezerwacja = Extent4.IdRezerwacja)
AND (Extent4.Kwota > 100000))
AND Extent1.IdGosc = Project1.IdGosc)
这与戈登·林诺夫在这篇文章中回答的内容类似。中间的子查询消失了。 当然,新查询工作正常!
总结一下,我猜.NET的MySQL提供程序比这些版本更好。我仍然有一些问题导致类似的问题,但现在我想我知道为什么 - 提供者。我很好。
令人讨厌的是,在MySQL Installer中有两个不同版本的dll,一个覆盖另一个版本。我正在使用mysql-installer-community-5.6.13.0。