Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Schnellere Alternative für meinen Sub SELECT

Begonnen von Felix__, Mai 19, 2011, 09:45:12

⏪ vorheriges - nächstes ⏩

Felix__

Moin zusammen,
ich möchte folgendes erreichen:
Ich möchte in meiner Tabelle alle doppelten Einträge zählen unde diese dann in einer extra Spalte anzeigen lassen, aber ohne ein GROUP BY zu machen, dh ich möchte die EInträge die doppelt sind stehen lassen und dahinter dann stehen haben wie oft diese Zeile noch vorkommt, ich hab das auch schon so mehr oder weniger hinbekommen aber mein SQL Statement ist dann einfach viel zu langsam bei 34000 Datensätzen.


SELECT [SNR-BVE-Kenner-SAP].ID, MATNR, ERSDA, ERNAM, LAEDA, MTART, ([BVE A] & [BVE B] & [BVE C] & [BVE D] & [BVE E] & [BVE F] & [BVE G]) AS BVEOLD, ZZBVE,MAKTX
FROM [SNR-BVE-Kenner-SAP] LEFT JOIN [BVE-SRM] ON LEFT([SNR-BVE-Kenner-SAP].MATNR,11) = [BVE-SRM].Sachnummer
ORDER BY MATNR ASC

ich hatte es mit einem SUb Select als extra Spalte versucht, nach "MAKTX" ein (SELECT COUNT(....) FROM .... WHERE...)
das hat auch geklappt aber das war viel zu langsam, weil ich dort in einer anderen Tabelle nach den [SNR-BVE-Kenner-SAP].ID gesucht habe und gezählt wie oft diese dort vorkommen, das war genau das was ich gebraucht habe aber war wie gesagt nicht schnell genug weil er jetzt für jeden der 34000 Daten in dieser Tabelle eine Abfrage über alle ca 30000 Datensätze in der anderen Tabelle geamcht hat.
Wie gesagt alternativ würde es mir völlig reichen wenn er die doppelten [SNR-BVE-Kenner-SAP].ID aus dieser Tabelle zählen würde und es al extra Spalte dartellen könnte.

PS Wenn ich einfach nur ein COUNT(MATNR) als Spalte setzte will er natürlich das ich dann nach allen anderen Spalte grupiere und dann wären aber meine doppelten EInträge weg, das geht also wohl auch nicht.

Danke
Mfg

ebs17

Ein Subselect pro Datensatz ist in der Tat mächtiger Aufwand und dann besser, insbesondere bei größeren Datenmengen, zu vermeiden.
Eine geeignete Indizierung in den Tabellen ist vorhanden? Indexnutzung tut der Performance gut.

Vorschlag:
1) Du erzeugst die zusätzliche Spalte sofort für die Tabelle
2) und bindest die resultierende Abfrage statt der ursprünglichen Tabelle in Deine Abfrage ein.
Somit würde das Zählen nur einmal ausgeführt.

Ansatz für 1)
SELECT T.*, U.Anzahl_ID
FROM [SNR-BVE-Kenner-SAP] T
INNER JOIN
(SELECT A.ID, Count(A.ID) AS Anzahl_ID
FROM [SNR-BVE-Kenner-SAP] A
GROUP BY A.ID) U
ON T.ID = U.ID



MfGA
ebs

Felix__

Im Prinzip passt das was du geschrieben hast, das Problem ist nur das ich auf genau der Spalte die 2 Tabellen joine, auf der ich auch die doppelten Einträge zählen will, dh wenn ich das mache was du gepostet hast dann Joine ich mit dem SubSelect auf einer Tabelle in der schon ein paar Einträge fehlen wegens des GROUP BY ID.
Am Ende bekomme ich dann eine Ergebnistabelle in der 2-3 tausend Einträge weniger drin sind als es eigentlich sollten.

ebs17

Die von mir gezeigte Abfrage hat weniger Datensätze als die Tabelle [SNR-BVE-Kenner-SAP] ?

MfGA
ebs

Felix__

Nein das nicht aber weniger als gewollt.
Sagen mir mal meine Tabelle A hat 35000 Einträge und Tabelle B hat 33000.
So jetzt will ich auf Spalte A.MATNR und B.Sachnummer beide Tabellen joinen.
A.MATNR kommt in Tabelle A ein paar mal doppelt vor und B.Sachnummer in Tabelle B ein paar mal doppelt vor.
Das bedeuted wenn ich ein "FROM Tabelle A LEFT JOIN Tabelle B ON A.MATNR = B.Sachnummer"  mache dann hat meine Ergebnis Tabelle ein paar Einträge mehr als 35000, ca 37000 in meinem Fall, das ist auch das gewünschte Ergebnis. die Einträge die in B doppelt sind sollen halt per Kreuzprodukt oder wie auch immer in die Ergebnistabelle einfließen

ebs17

ZitatNein das nicht aber weniger als gewollt.
Was ist das für eine Aussage? Abfrage hat genau so viel Datensätze wie die Tabelle, aber weniger als gewollt. (Schwachsinn)

Mein Vorschlag lt. 2) war, diese Abfrage, die die Tabelle zzgl. der Anzahlspalte darstellt, statt der Tabelle in Deine Abfrage einzubauen. Erst durch den JOIN mit einer weiteren Tabelle können sich die "zusätzlichen" Datensätze ergeben, innerhalb einer Tabelle oder der der Tabelle gleichen Abfrage doch wohl nicht.

MfGA
ebs

Felix__

Ok, ich hatte natürlich vergessen die gejointe Tabelle aus deinem Post nochmals normal zu joinen wie ich es vorher schon gemacht habe. Wenn ich diese 2 Joins hintereinander mache dann klappt alles und ist auch recht flott :-)

Also Danke für die Hilfe!
MFG