2016-08-08 7 views
0

Ich versuche, die folgende db2 Abfrage auszuführen, aber ich bin immer diese Fehlermeldung:SqlSyntaxErrorException in DB2 Query

SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-119, SQLSTATE=42803, SQLERRMC=ENTITLEMENT

Die Abfrage ist:

SELECT * 
FROM reclaimbalance rb 
    ,user_benefit_accrued_period ubap 
WHERE rb.user_id = ubap.user_id 
    AND rb.component_id = ubap.PAY_HEAD_ID 
    AND ubap.CUSTOMER_ID = 281 
    AND rb.year = '2016-2017' 
    AND ubap.STATUS = 1 
GROUP BY ubap.user_id 
    ,ubap.PAY_HEAD_ID 
HAVING sum(ubap.STD_BALANCE_ADDED_IN_PERIOD) != rb.ENTITLEMENT 
+0

Sie sollten Ihr Tabellenschema, Beispieldaten und erwartete Ergebnisse veröffentlichen. Ich vermute, dass das Problem um die Klauseln "Gruppe von" und "Haben" geht, aber es ist schwer zu verstehen, was Sie zu tun versuchen. – sgeddes

+0

hey @sgeddes .... danke für die Antwort. – user1359

+0

Ich möchte die Datensätze aus zwei Tabellen auf der Grundlage eines Datensatzes holen, die Summe ist nicht gleich – user1359

Antwort

0

Ein Problem ist SELECT *. Ich würde erwarten, dass der Fehler ein bisschen anders ist als nur ein generischer Syntaxfehler.

Auch sollten Sie lernen, explizite JOIN Syntax zu verwenden. Und Ihre HAVING-Klausel hat eine nicht aggregierte Spalte.

Ich nehme an, Sie so etwas wie dies wollen:

SELECT ubap.user_id, ubap.PAY_HEAD_ID, rb.ENTITLEMENT, 
     sum(ubap.STD_BALANCE_ADDED_IN_PERIOD) 
FROM reclaimbalance rb JOIN 
    user_benefit_accrued_period ubap 
     ON rb.user_id = ubap.user_id AND rb.component_id = ubap.PAY_HEAD_ID 
WHERE ubap.CUSTOMER_ID = 281 AND rb.year = '2016-2017' AND ubap.STATUS = 1 
GROUP BY ubap.user_id, ubap.PAY_HEAD_ID, rb.ENTITLEMENT 
HAVING sum(ubap.STD_BALANCE_ADDED_IN_PERIOD) <> rb.ENTITLEMENT; 
+0

SQLCODE = -119 ist [spezifisch genug] (http://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.messages.sql.doc/doc/msql00119n.html): "Ein mit _expression-start_ in einer SELECT-, HAVING- oder ORDER BY-Klausel beginnender Ausdruck wird nicht in der GROUP BY-Klausel oder in einer SELECT-Klausel, HAVING-Klausel oder ORDER BY-Klausel mit einer Spaltenfunktion und keiner angegeben GROUP BY-Klausel ist angegeben. " – mustaccio

0

Das Problem wird durch die sqlcode = -119 diagnostiziert ist, dass die Spalte „ANSPRUCH“ in der HAVING-Klausel weder auf dieser HAVING-Klausel innerhalb eines Aggregats codiert Funktion noch ist die Spalte "ENTITLEMENT" in der GROUP BY-Klausel angegeben.
Die Wiederherstellung erfolgt entweder durch Entfernen der nicht aggregierten Referenz auf die Spalte "ENTITLEMENT" aus der HAVING-Klausel, Ändern der Referenz auf die Spalte "ENTITLEMENT" innerhalb einer Aggregatfunktion oder Hinzufügen der Spalte "ENTITLEMENT" zur GROUP BY-Klausel.

Beachten Sie jedoch, dass, obwohl gültig Wiederherstellung, der Effekt möglicherweise nicht, was erforderlich ist. Und selbst nach diesem sqlcode = -119 Problem wird nach einer der möglichen Wiederherstellung Aktionen oben erwähnt, fast sicher das nächste Problem wird für einen sqlcode sein - = - 122 schlägt vor, dass einige Spalten oder nicht-aggregate \ non [effective-] konstante Ausdrücke, die in der SELECT-Liste enthalten sind, werden nicht auch in der GROUP BY-Klausel genannt. FWiW: Trotz gegenteiliger Anspielung (en) kann die SELECT * mit GROUP BY kompatibel sein, aber nur ein Spezialfall; Wie die Regeln angeben, muss die ausgewählte Spalte [die implizit für das Sternchen ausgewählt wurde] auch in GROUP BY angegeben werden.