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

时间:2013-08-22 10:19:41

标签: mysql sql sql-server nested

我在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嵌套查询的限制吗?

(请不要提供返回相同和工作的查询,我也可以这样做,但这不是我的观点)

3 个答案:

答案 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。