我有一个奇怪的问题:
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 ;
我很难过!有什么建议吗?
答案 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中执行此操作会为我提供在查询浏览器中执行时获得的所有行。