0

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

(请不要提供返回相同且有效的查询,我也可以这样做,但这不是我的意思)

4

3 回答 3

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`
             )

幸运的是,在这种情况下,您可以消除中间子查询。

于 2013-08-22T11:19:41.717 回答
0

好的。原来是 MySQL 的问题。我正在使用实体框架的查询,后来变成了特定于数据库的 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)))

对比

-- 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)

这与 Gordon Linoff 在这篇文章中回答的类似。中间子查询消失。当然,新查询可以正常工作!

总而言之,我猜 .NET 的 MySQL 提供程序比这些版本更好。我仍然有一些导致类似问题的查询,但现在我想我知道为什么会这样了 - 提供者。我没问题。

令人讨厌的是,在 MySQL 安装程序中有两种不同版本的 dll,一种覆盖另一种。我正在使用 mysql-installer-community-5.6.13.0。

于 2013-08-22T12:49:06.300 回答
0

我在 mysql 中也遇到过这种错误。我在 tht tym 所做的是:mysql只记住当前表,所以尝试这样做可能会起作用

代替

 FROM `TRezerwacja` AS `Extent3 

FROM `TRezerwacja` AS `Extent3`,`TGosc` AS `Extent1`
于 2013-08-22T10:29:45.027 回答