Hallo zusammen, ich bin gerade etwas verwundert und ratlos. Ich möchte eine SQL Abfrage durch zusätzliche WHERE einschränken.
Folgende SQL war die Ausgangsbasis:
SELECT
C.auftragid, C.auftragnumber, C.rating, C.description, C.statusid, B.customerid, B.customername, B.customernumber, B.landid, B.bscid, D.landname, E.bscname, F.statusname, DATEDIFF(CURDATE(), G.tododate) AS tododate, G.tododescription
FROM
tab_rel_customer_auftrag A
JOIN
tab_customer B ON B.customerid = A.customerid
JOIN
tab_auftrag C ON C.auftragid = A.auftragid
JOIN
tab_land D ON D.landid = B.landid
JOIN
tab_bsc E ON E.bscid = B.bscid
JOIN
tab_status F ON F.statusid = C.statusid
LEFT JOIN
tab_todo G ON G.auftragnumber = C.auftragnumber
WHERE C.active = 1
ORDER BY C.auftragnumber ASC
Das Ergebnis ist 1781 Zeilen Jetzt wird zusätzlich das Ergebnis mit "AND C.statusid != 6" eingeschränkt
SELECT
C.auftragid, C.auftragnumber, C.rating, C.description, C.statusid, B.customerid, B.customername, B.customernumber, B.landid, B.bscid, D.landname, E.bscname, F.statusname, DATEDIFF(CURDATE(), G.tododate) AS tododate, G.tododescription
FROM
tab_rel_customer_auftrag A
JOIN
tab_customer B ON B.customerid = A.customerid
JOIN
tab_auftrag C ON C.auftragid = A.auftragid
JOIN
tab_land D ON D.landid = B.landid
JOIN
tab_bsc E ON E.bscid = B.bscid
JOIN
tab_status F ON F.statusid = C.statusid
LEFT JOIN
tab_todo G ON G.auftragnumber = C.auftragnumber
WHERE C.active = 1
AND C.statusid != 6
ORDER BY C.auftragnumber ASC
Ergebnis = 1371, 410 rows ausgefiltert, soweit ok.
Jetzt eine Einschränkung mit AND C.rating != 100 AND C.rating != 0
SELECT
C.auftragid, C.auftragnumber, C.rating, C.description, C.statusid, B.customerid, B.customername, B.customernumber, B.landid, B.bscid, D.landname, E.bscname, F.statusname, DATEDIFF(CURDATE(), G.tododate) AS tododate, G.tododescription
FROM
tab_rel_customer_auftrag A
JOIN
tab_customer B ON B.customerid = A.customerid
JOIN
tab_auftrag C ON C.auftragid = A.auftragid
JOIN
tab_land D ON D.landid = B.landid
JOIN
tab_bsc E ON E.bscid = B.bscid
JOIN
tab_status F ON F.statusid = C.statusid
LEFT JOIN
tab_todo G ON G.auftragnumber = C.auftragnumber
WHERE C.active = 1
AND C.rating != 100 AND C.rating != 0
ORDER BY C.auftragnumber ASC
Ergebnis: 851, 930 rows ausgefiltert
Jetzt werden beide bzw. alle AND verknüpft. AND C.rating != 100 AND C.rating != 0 AND C.statusid != 6
SELECT
C.auftragid, C.auftragnumber, C.rating, C.description, C.statusid, B.customerid, B.customername, B.customernumber, B.landid, B.bscid, D.landname, E.bscname, F.statusname, DATEDIFF(CURDATE(), G.tododate) AS tododate, G.tododescription
FROM
tab_rel_customer_auftrag A
JOIN
tab_customer B ON B.customerid = A.customerid
JOIN
tab_auftrag C ON C.auftragid = A.auftragid
JOIN
tab_land D ON D.landid = B.landid
JOIN
tab_bsc E ON E.bscid = B.bscid
JOIN
tab_status F ON F.statusid = C.statusid
LEFT JOIN
tab_todo G ON G.auftragnumber = C.auftragnumber
WHERE C.active = 1
AND C.rating != 100 AND C.rating != 0 AND C.statusid != 6
ORDER BY C.auftragnumber ASC
**Ergebnis 817, nur 34 rows gefiltert bzw. weniger
Erwartet hätte ich aber Ergebnis 441 rows und 1340 rows ausgefiltert**
Jetzt frage ich mich warum sich die Abfrage so verhält wenn man alle AND zusammenfasst?
Hat jemand eine Erklärung dafür?
viele Grüße hawk