2017-01-05 9 views
1

Ich versuche, eine innere Verbindung zwischen dieser Tabelle auszuführen. Was ist falsch an meiner Syntax?Inner Join gleichen Tabelle Syntaxfehler

(SELECT user_key, bill_number, MAX(payment_date) AS payment_date 
FROM billpayment) bpt 
INNER JOIN (SELECT * FROM billpayment) bp 
    ON bp.user_key=bpt.user_key 
    AND bp.bill_number=bpt.bill_number 
    AND bp.payment_date=bpt.payment_date 
GROUP BY user_key, bill_number; 

Er sagt, dass der SQL-Befehl nicht richtig an der Klammer in beendet 'billpayment)'

+1

mysql oder Oracle? Bitte markieren Sie nur das verwendete DBMS – JohnHC

+0

Entfernen Sie die Klammern vom Anfang und nach 'FROM billpayment' – CptMisery

+0

Was möchten Sie hier erreichen? Wählen Sie aus dieser Tabelle, wo es in der gleichen Tabelle existiert? Weil es das ist, was diese Abfrage – JohnHC

Antwort

2
SELECT 
    user_key, 
    bill_number, 
    MAX(payment_date) AS payment_date 
    FROM billpayment bpt 
    INNER JOIN billpayment bp 
    ON bp.user_key=bpt.user_key 
    AND bp.bill_number=bpt.bill_number AND bp.payment_date=bpt.payment_date 
    GROUP BY 
    user_key, bill_number 

; 
+0

tut, würde es helfen, eine JOIN ON-Bedingung wie 'bp.payment_date <> bpt.payment_date' einzubeziehen, um zu vermeiden, dass ein Datensatz sowohl in der linken als auch der rechten Tabelle hinzugefügt wird, oder würde möglicherweise kritische Kombinationen ausschließen ? –

1

On Oracle Versuchen Sie folgendes:

SELECT * 
    FROM (SELECT user_key, bill_number, MAX (payment_date) AS payment_date FROM billpayment) bpt 
     INNER JOIN billpayment bp 
      ON bp.user_key = bpt.user_key AND bp.bill_number = bpt.bill_number AND bp.payment_date = bpt.payment_date 
    GROUP BY user_key, bill_number; 

Kann es bisher nicht testen, ohne die Tabellenstruktur .

0

Wie wäre es nur mit analytischen Funktionen?

select bp.*, 
     max(bp.paymentdate) over (partition by user_key, bill_number) as max_payment_date 
from billpayment 

Wenn Sie die Felder auf der max Zahlungstermin wollen:

select bp.* 
from (select bp.*, 
      max(bp.paymentdate) over (partition by user_key, bill_number) as max_paymentdate 
     from billpayment 
    ) bp 
where paymentdate = max_paymentdate; 
0

Auf mySQL, können Sie versuchen, so etwas wie:

SELECT bpt.user_key, bpt.bill_number, MAX(bpt.payment_date) AS payment_date 
FROM billpayment bpt 
INNER JOIN (SELECT * FROM billpayment) bp 
    ON bp.user_key=bpt.user_key 
    AND bp.bill_number=bpt.bill_number 
    AND bp.payment_date=bpt.payment_date 
GROUP BY bpt.user_key, bpt.bill_number;