2009-03-06 7 views
0

Ich habe ein seltsames Problem:LEFT JOIN Problem innerhalb einer gespeicherten Prozedur

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; 

Ich nenne das aus einer Abfrage-Browser und es 3 Zeilen zurückgibt. Ich rufe es aus einer gespeicherten Prozedur heraus und es gibt 2 Zeilen (der LINKE JOIN wird unwirksam).

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 ; 

Ich bin ratlos! Irgendwelche Vorschläge?

+0

Was sind a, b und c? Ich glaube, du hast etwas vergessen. –

+0

@Tom Ritter: Ich nehme an, er ist in der unästhetischen Angewohnheit, seine Join-Tabellen alphabetisch zu aliasieren. – Tomalak

+0

@Ted: Würden Sie Ihre Frage bearbeiten und die Tabellenaliase an den richtigen Stellen hinzufügen? – Tomalak

Antwort

1

Haben Sie vergessen, eine der Sitzungen zu COMMIT/ROLLBACK nach einem UPDATE/DELETE/INSERT?

0

Ich habe nicht viel Erfahrung mit MySQL, aber gibt es irgendwelche verbindungsspezifischen Einstellungen, die dazu führen würden, dass sich NULL-Vergleiche in jedem Fall anders verhalten? Wenn zum Beispiel die VersionNein NULL sein könnte, könnte eine Verbindung NULL = NULL sein, aber die andere könnte dies als falsch bewerten.

0

Ich versuchte es in SQL Server und nach einer kleinen Änderung für mich funktioniert:

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 

es versuchen.

0

Ich habe es mit einer völlig bizarren und unlogischen Veränderung gelöst.

Das innerhalb der Sproc gibt mir alle Zeilen, die ich bekam, wenn sie innerhalb des Abfrage-Browsers ausgeführt wurde.

Verwandte Themen