Проблема с левым присоединением в хранимой процедуре - PullRequest
0 голосов
/ 06 марта 2009

У меня странная проблема:

SELECT a.uid, b.*, c.liveId FROM a
INNER JOIN b ON (a.uid=b.uid AND a.versionNo=b.versionNo)
LEFT JOIN c ON (a.uid=c.uid)
WHERE a.memberId=1;

Я звоню из браузера запросов, и он возвращает 3 строки. Я вызываю его из хранимой процедуры, и она дает 2 строки (LEFT JOIN становится неэффективным)

    DELIMITER //

    DROP PROCEDURE IF EXISTS sp_Test //

    CREATE
      DEFINER = CURRENT_USER
      PROCEDURE sp_Test( IN in_mid INTEGER UNSIGNED )

      READS SQL DATA
      NOT DETERMINISTIC

    BEGIN

     SELECT a.uid, b.*, c.liveId FROM a
     INNER JOIN b ON (a.uid=b.uid AND a.versionNo=b.versionNo)
     LEFT JOIN c ON (a.uid=c.uid)
     WHERE a.memberId=in_mid;

    END //

DELIMITER ;

Я в тупике! Есть предложения?

Ответы [ 4 ]

1 голос
/ 06 марта 2009

Вы забыли выполнить COMMIT / ROLLBACK одну из сессий после выполнения UPDATE / DELETE / INSERT?

0 голосов
/ 07 марта 2009

Я решил это с совершенно странным и нелогичным изменением.

SELECT a.uid, b.*, c.liveId FROM a
     INNER JOIN b ON (a.uid=b.uid AND a.versionNo=b.versionNo)
     LEFT JOIN c ON (a.uid=c.uid)
     WHERE a.memberId=in_mid
UNION
SELECT a.uid, b.*, c.liveId FROM a
     INNER JOIN b ON (a.uid=b.uid AND a.versionNo=b.versionNo)
     LEFT JOIN c ON (a.uid=c.uid)
     WHERE a.memberId=in_mid;

Выполнение этого в sproc дает мне все строки, которые я получал при выполнении в браузере запросов.

0 голосов
/ 06 марта 2009

Я попробовал это в SQL Server, и после небольшого изменения он работает для меня:

CREATE PROCEDURE sp_Test(
@in_mid int)
AS
BEGIN
SELECT a.uid, b.*, c.liveId FROM a
    INNER JOIN b ON (a.uid=b.uid AND a.versionNo=b.versionNo)
    LEFT JOIN c ON (a.uid=c.uid)
    WHERE a.memberId=@in_mid;
END 

Попробуй.

0 голосов
/ 06 марта 2009

У меня нет большого опыта работы с MySQL, но есть ли какие-то настройки, специфичные для соединения, которые заставили бы сравнения NULL работать по-разному в каждом случае? Например, если versionNo может быть NULL, то одно соединение может рассматривать NULL = NULL, но другое может оценить это как ложное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...