ОШИБКА 1066 (42000): неуникальная таблица/псевдоним: «mp» ВНЕШНЕЕ СОЕДИНЕНИЕ в mysql

у меня проблема с преобразованием моей базы данных informix в mysql. Я сделал большинство вещей, но некоторые функции просто не работают.

DELIMITER //
CREATE PROCEDURE mw_getsvid(mwid INT) RETURNS INT
BEGIN
DECLARE svId INT;
SELECT sv.ID INTO svId
FROM messwert AS mw, messpunkt AS mp, mpzuordnung AS mpz, summvorschrift    AS sv
    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, messpunkt AS mp, mpzuordnung AS mpz, summvorschrift AS sv
    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 ;

это появляется: ОШИБКА 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;

было бы здорово, если бы вы хорошо подумали об этом :)


person itsme    schedule 02.08.2017    source источник
comment
Не смешивайте имплизит и эксплизит   -  person Jens    schedule 02.08.2017
comment
но разве это не то, что делает внешнее соединение?   -  person itsme    schedule 02.08.2017
comment
`внешнее соединение - это открытое соединение, но у вас также есть таблицы, разделенные запятыми, где соединение сформулировано в предложении where. Это не работает   -  person Jens    schedule 02.08.2017


Ответы (1)


Если вы собираетесь использовать 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 ;
person nacho    schedule 02.08.2017
comment
теперь он показывает другую синтаксическую ошибку ^^ ОШИБКА 1064 (42000): у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с 'INT BEGIN DECLARE svId INT; SELECT sv.ID INTO svId FROM messwert AS mw LEFT ' в строке 1 - person itsme; 02.08.2017
comment
@itsme Извините, я просто скопировал и вставил ваш код, попробуйте сейчас. Если вам нужно возвращаемое значение, вы должны использовать ФУНКЦИЮ, в противном случае вы можете использовать ПРОЦЕДУРУ - person nacho; 02.08.2017