2010-11-24 7 views
6

Hier ist die SQL:Kann nicht Grund für „Spalte zweideutig definiert“ Fehler identifizieren

SELECT alloc.oa_id 
    FROM qdod.qtran_owner_allocation alloc 
     INNER JOIN 
      (SELECT h.oa_id, h.div_ord_no, h.process_queue_id, h.from_ba_no, 
        h.from_ba_suf, h.from_interest_type_cd, h.from_interest_type_cd, h.from_div_ord_grp, 
        h.transfer_percent, h2.original_net_amount, h2.new_net_amount 
      FROM qdod.qtran_fund_transfer_hist h 
        INNER JOIN 
        (SELECT DISTINCT h0.oa_id, h0.original_net_amount, h1.new_net_amount 
         FROM qdod.qtran_fund_transfer_hist h0 
          INNER JOIN 
           (SELECT h4.oa_id, SUM (h4.new_net_amount) AS new_net_amount 
            FROM qdod.qtran_fund_transfer_hist h4 
           GROUP BY h4.oa_id) h1 
          ON h0.oa_id = h1.oa_id 
         WHERE h0.original_net_amount <> h1.new_net_amount AND h0.oa_id >= 100000000) h2 
        ON h.oa_id = h2.oa_id) h3 
     ON alloc.oa_id = h3.oa_id; 

Jede Spalte hat seine Tabelle definiert. Der innere Hauptjoin (der nach der Zuordnungstabelle) läuft gut, wenn er selbst ausgeführt wird. Irgendwelche Ideen, warum das nicht funktioniert? Dies wird gegen eine Oracle 10.2.0.4 Datenbank ausgeführt (ich habe es auch mit einer 11.2.0.1 Datenbank versucht, wenn ich denke, dass es sich um einen Oracle-Bug handelt, der in 11.2 behoben wurde, aber auch dort fehlgeschlagen ist).

Antwort

5

Feld in der Erklärung dupliziert, könnte etwas damit zu tun haben

h.from_interest_type_cd, h.from_interest_type_cd, 
+0

+1 Gutes Auge. Wie in [meine Antwort] (http://stackoverflow.com/questions/4268140/cant-idenfity-reason-for-column-ambiguous-defined-error/4268305#4268305) hingewiesen, denke ich nicht, diese Spalte sogar muss ausgewählt werden. –

2

Sie scheinen viele Spalten werden auswählen, die Sie nicht wirklich brauchen, wie Sie sie nicht überall verwenden. Die Abfrage könnte möglicherweise vereinfacht werden:

SELECT alloc.oa_id 
    FROM qdod.qtran_owner_allocation alloc 
     INNER JOIN 
      (SELECT h.oa_id 
      FROM qdod.qtran_fund_transfer_hist h 
        INNER JOIN 
        (SELECT DISTINCT h0.oa_id 
         FROM qdod.qtran_fund_transfer_hist h0 
          INNER JOIN 
           (SELECT h4.oa_id, SUM (h4.new_net_amount) AS new_net_amount 
            FROM qdod.qtran_fund_transfer_hist h4 
           GROUP BY h4.oa_id) h1 
          ON h0.oa_id = h1.oa_id 
         WHERE h0.original_net_amount <> h1.new_net_amount AND h0.oa_id >= 100000000) h2 
        ON h.oa_id = h2.oa_id) h3 
     ON alloc.oa_id = h3.oa_id; 
+0

Danke an euch beide. Das hat es getan. Beide Lösungen hätten es gelöst. – Nik

+0

@Nik: Neben dem Korrigieren des Fehlers sollte die Beseitigung der nicht benötigten Spalten die Abfrageleistung verbessern. –

Verwandte Themen