2013-08-22 70 views
0

我在MySQL和SQLServer上運行多個查詢(兩個服務器上的查詢相同,相同的數據庫)。他們幾乎全部運行良好。我有這個一個問題:MySQL嵌套查詢不會運行,在SQL Server上運行

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未知列「Extent1.IdGosc '在'where子句'中。

爲什麼這麼說?:| 對MySQL嵌套查詢有任何限制嗎?

(請不要提供返回相同的工作問題,我可以做到這一點爲好,但它不是我的觀點)

回答

0

我也有遇到這種錯誤的mysql.What我已經做了在THT TYM是: 的MySQL只記得當前表,以便嘗試這樣做可能b檢查會工作

更換

FROM `TRezerwacja` AS `Extent3 

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

不幸的是,會給不同的結果。 SELECT'Extent3'.'IdRezerwacja'子查詢將在整個TGosc表上運行,而不是上部子查詢(通過加入TOsoba)減少的內容。 順便說一句,這不是我創建查詢。它是實體框架。 –

+0

好的。我對此很陌生,但正在努力幫助。 – Navya

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

幸運的是,在這種情況下,您可以消除中間子查詢。

+0

這是正確的,這是MySQL的一個問題。我在下面發佈更詳細的答案。 –

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。它包括版本6.7.4中的MySQL.Data和MySQL.Data.Entities。

但是,我還爲Visual Studio 1.0.2安裝了MySQL,以便能夠使用比Visual Studio中的代碼更多的GUI。但是這個東西帶有相同的dll,只是在不同的(舊的)版本6.6.5中。這些應用程序在運行時優先於新的應用程序。 (奇怪的是,在同一個MySQL安裝程序中,有兩個相同的DLL的某些衝突版本。)

無論如何,我刪除了MySQL for Visual Studio 1.0.2,這讓我留下了更新的DLL,並看到會發生什麼情況十分相同的LINQ to Entities查詢,當它被翻譯爲DB SQL:

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

這是simila回到Gordon Linoff在這篇文章中回答的問題。中間子查詢消失。 當然,新的查詢工作正常!

總結一下,我猜是MySQL提供商。NET在這些版本上變得更好。我仍然有一些查詢導致類似的問題,但現在我想我知道這是爲什麼 - 提供商。我確定。

惱人的是,在MySQL安裝程序中有兩個不同版本的dll,一個覆蓋另一個。我正在使用mysql-installer-community-5.6.13.0。