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

Ok。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 です。バージョン 6.7.4 の MySQL.Data と MySQL.Data.Entities が含まれています。

ただし、Visual Studio のコードよりも多くの GUI を使用できるように、Visual Studio 1.0.2 用の MySQL もインストールしました。しかし、これには同じ dll が付属していますが、異なる (古い) バージョン 6.6.5 だけです。そして、アプリケーションが実行されているとき、これらは新しいものよりも優先されました。(そもそも、同じ MySQL インストーラーに同じ dll の競合するバージョンが 2 つあるというのは奇妙です。)

とにかく、私は 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 Installer に 2 つの異なるバージョンの 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 に答える