2017-08-02 68 views
0

我有一個問題,將我的informix數據庫轉換爲mysql。 我得到了大部分的事情,但一些功能只是不工作。錯誤1066(42000):不是唯一的表/別名:'mp'在mysql中的外部連接

這表明了:ERROR 1066(42000):不是唯一的表/別名: 'MP'

順便說一句,這是舊

CREATE PROCEDURE "informix".mw_getsvid(mwid INT) 
RETURNING INT; 

DEFINE svId INT; 
SELECT sv.ID INTO svId 
    FROM MessWert mw, MessPunkt mp, 
     OUTER (MPZuordnung mpz, SummVorschrift sv) 
    WHERE mw.id = mwid 
     AND mw.messpunktid = mp.id 
     AND mp.id = mpz.messpunktid 
     AND mpz.summvorschriftid = sv.id 
     AND mpz.zeitraum_von <= mw.datendatum 
     AND mpz.zeitraum_bis > mw.datendatum; 

RETURN svId; 

END PROCEDURE; 

將是馬麗娟如果u有一好的想法:) :)

+0

不要混合implizit和explizit加入 – Jens

+0

但不是什麼外連接呢? – itsme

+0

'outer join是一個explizit連接,但你也有逗號分隔的表,其中連接是在where子句中制定的。這不起作用 – Jens

回答

0

如果你要使用JOIN,你不需要使用FROM子句中的所有表,因爲你做的工作是重複的。如果您要將表放入FROM子句和JOIN中,則應使用不同的別名。你應該這樣做:

DELIMITER // 
CREATE FUNCTION mw_getsvid(mwid INT) RETURNS INT 
BEGIN 
DECLARE svId INT; 
SELECT sv.ID INTO svId 
FROM messwert AS mw 
    LEFT JOIN messpunkt mp ON mw.messpunktid = mp.id 
    LEFT JOIN mpzuordnung mpz ON mp.id = mpz.messpunktid 
    LEFT JOIN summvorschrift sv ON mpz.summvorschriftid = sv.id 
    LEFT JOIN messwert mw ON mpz.zeitraum_von <= mw.datendatum 
    LEFT JOIN messwert mw ON mpz.zeitraum_bis > mw.datendatum; 
UNION ALL 
SELECT sv.ID INTO svId 
FROM messwert AS mw 
    RIGHT JOIN messpunkt mp ON mw.messpunktid = mp.id 
    RIGHT JOIN mpzuordnung mpz ON mp.id = mpz.messpunktid 
    RIGHT JOIN summvorschrift sv ON mpz.summvorschriftid = sv.id 
    RIGHT JOIN messwert mw ON mpz.zeitraum_von <= mw.datendatum 
    RIGHT JOIN messwert mw ON mpz.zeitraum_bis > mw.datendatum; 
RETURN svId; 

END //; 

DELIMITER ; 
+0

現在它顯示不同的語法錯誤^^ 錯誤1064(42000):您的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以找到在'INT BEGIN DECLARE svId INT; SELECT sv.ID INTO svId FROM messwert AS mw LEFT'at line 1 – itsme

+0

@itsme對不起,我剛從你的代碼中複製並粘貼,現在就試試。如果您需要返回值,則必須使用FUNCTION,否則可以使用PROCEDURE – nacho

相關問題