存储过程中的LEFT JOIN问题

时间:2009-03-06 18:34:55

标签: sql mysql

我有一个奇怪的问题:

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 个答案:

答案 0 :(得分:1)

在执行UPDATE / DELETE / INSERT之后,您是否忘记了COMMIT / ROLLBACK其中一个会话?

答案 1 :(得分:0)

我对MySQL没有很多经验,但有没有任何特定于连接的设置会导致NULL比较在每种情况下都采取不同的行为?例如,如果versionNo可能为NULL,则一个连接可能会认为NULL = NULL,但另一个连接可能会将其评估为false。

答案 2 :(得分:0)

我在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 

试试吧。

答案 3 :(得分:0)

我已经用一种完全奇异且不合逻辑的变化解决了这个问题。

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中执行此操作会为我提供在查询浏览器中执行时获得的所有行。