【问题标题】:MySQL nested query won't run, runs on SQL ServerMySQL 嵌套查询不会运行,在 SQL Server 上运行
【发布时间】:2013-08-22 20:49:06
【问题描述】:

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

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

【问题讨论】:

    标签: mysql sql sql-server nested


    【解决方案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`
                 )
    

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

    【讨论】:

    • 没错,是MySQL的问题。我将在下面发布更详细的答案。
    【解决方案2】:

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

    替换

     FROM `TRezerwacja` AS `Extent3 
    

    FROM `TRezerwacja` AS `Extent3`,`TGosc` AS `Extent1`
    

    【讨论】:

    • 不幸的是,这会产生不同的结果。 SELECT Extent3.IdRezerwacja 子查询将在整个 TGosc 表上运行,而不是在上面的子查询中(通过加入 TOsoba)简化为。顺便说一句,创建查询的不是我。它是实体框架。
    【解决方案3】:

    好的。原来是 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多