2009-03-06 8 views
0

以内に問題を登録しよう。私はストアドプロシージャ内から呼び出すと2行(LEFT JOINは無効になります)を返します。LEFTは、私は奇妙な問題をしたストアドプロシージャ

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

a、b、cとは何ですか?私はあなたが何かを残したと思う。 –

+0

@トム・リッター:私は彼がアルファベットで彼のジョインテーブルのエイリアスを覚える習慣がないと思います。 – Tomalak

+0

@Ted:あなたの質問を編集し、適切な場所にテーブルエイリアスを追加しますか? – Tomalak

答えて

1

UPDATE/DELETE/INSERTを実行した後で、セッションの1つをCOMMIT/ROLLBACKするのを忘れましたか?

0

私はMySQLに多くの経験はありませんが、それぞれの場合にNULL比較が異なるようになる接続固有の設定はありますか?たとえば、versionNoがNULLの場合、ある接続ではNULL = NULLとみなされますが、もう一方の接続ではfalseと評価される可能性があります。

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 [email protected]_mid; 
END 

はそれを試してみてください。

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を内私のクエリブラウザ内で実行されるときに私はなっていたすべての行を与えることを行います。