Hi,
erst mal vielen Dank für deine Antwort
Das, was ich schon mal mit Sicherheit beantworten kann: Das DBMS ist H2.
Hatte mich auch gewundert, dass du mich auf das CODE-Tag aufmerksam machst, bei dem ich mir eigentlich sicher war es verwendet zu haben
Dann habe ich gesehen, dass ich dieses nur bei der letzten Anfrage benutzt habe und mich bei den ersten beiden verklickt hatte. Also normalerweise benutze ich es
So... die Tabelle articles_prices habe ich gelöscht und führe wie du sagtest den Preis jetzt in der Tabelle articles auf.
Den Punkt, den ich nicht verstehe, ist deine Anmerkung über ON und WHERE.
Die 1. Abfrage sieht jetzt so aus:
Code:
SELECT C.customers_id, CONCAT(C.customers_lastname,', ',C.customers_firstname) AS name, COALESCE(ACP.articles_price_discount,0) AS discount, CAST((A.articles_price_netto-A.articles_price_netto/100*COALESCE(ACP.articles_price_discount,0)) AS DECIMAL(15,4)) AS discount_result FROM ARTICLES AS A, CUSTOMERS AS C LEFT JOIN ARTICLES_CUSTOMERS_PRICELIST AS ACP ON C.customers_id = ACP.customers_id AND ACP.articles_id = '720' WHERE A.articles_id = ACP.articles_id order by C.customers_id;
Die WHERE steht jetzt hinter dem ON, aber anders geht es ja nicht, oder?
Denn gejoint wird ja Customers und Article_Customers_Pricelist. Muss ja noch iirgendwie den Artikelnamen aus Articles bekommen oder soll ich das auch mit nem Join machen?
Diese Abfrage mit Ergebnis von 1000 Datensätzen dauert 140ms. War ja vorher auch sehr schnell...
Zu meinem Problemfall
Die ganz simple Form ohne Berechnungen:
Abfrage 2:
Code:
SELECT A.articles_id, ACP.articles_price_discount FROM ARTICLES AS A LEFT JOIN ARTICLES_CUSTOMERS_PRICELIST AS ACP ON ACP.CUSTOMERS_ID = '726' AND A.ARTICLES_ID = ACP.ARTICLES_ID;
Ohne WHERE. Fehlt das in diesem Falle? War das in diesem Falle das, was gefehlt hat oder habe ich dich da falsch verstanden? Sind ja nur noch 2 Tabellen jetzt, so dass ich ja alles im ON erledigen können müsste, oder nicht?
Umzustellen wüsste ich jetzt auch nichts
Laufzeit: Schlappe 16234 ms, also ein Windhund für Beamte...
Leider bin ich keiner...
Nun mit Explain davor:
Abfrage 1:
Code:
SELECT C.CUSTOMERS_ID, CONCAT(C.CUSTOMERS_LASTNAME, ', ', C.CUSTOMERS_FIRSTNAME) AS NAME, COALESCE(ACP.ARTICLES_PRICE_DISCOUNT, 0) AS DISCOUNT, CAST(A.ARTICLES_PRICE_NETTO - ((A.ARTICLES_PRICE_NETTO / 100) * COALESCE(ACP.ARTICLES_PRICE_DISCOUNT, 0)) AS DECIMAL(15, 4)) AS DISCOUNT_RESULT
FROM PUBLIC.CUSTOMERS C /* PUBLIC.PRIMARY_KEY_5 */
LEFT OUTER JOIN PUBLIC.ARTICLES_CUSTOMERS_PRICELIST ACP /* PUBLIC.PRIMARY_KEY_9: CUSTOMERS_ID = C.CUSTOMERS_ID AND ARTICLES_ID = '720' */ ON (ACP.ARTICLES_ID = 720) AND (C.CUSTOMERS_ID = ACP.CUSTOMERS_ID)
INNER JOIN PUBLIC.ARTICLES A /* PUBLIC.PRIMARY_KEY_12: ARTICLES_ID = ACP.ARTICLES_ID */
WHERE A.ARTICLES_ID = ACP.ARTICLES_ID
Abfrage 2:
Code:
SELECT A.ARTICLES_ID, ACP.ARTICLES_PRICE_DISCOUNT
FROM PUBLIC.ARTICLES A /* PUBLIC.TEMP_TABLE_0_0_TABLE_SCAN */
LEFT OUTER JOIN PUBLIC.ARTICLES_CUSTOMERS_PRICELIST ACP /* PUBLIC.PRIMARY_KEY_9: CUSTOMERS_ID = '726' AND ARTICLES_ID = A.ARTICLES_ID */ ON (ACP.CUSTOMERS_ID = 726) AND (A.ARTICLES_ID = ACP.ARTICLES_ID)
Hoffe, dass du damit was anfangen kannst!
Liebe Grüße
Lesezeichen