Datenbank Forum - für Anfänger und Profis

Willkommen im Datenbank Forum von Datenbanken-verstehen.de - Das Datenbank, Data Warehouse & Business Intelligence Forum!

Das Datenbank Forum für Anfänger und Profis ist eine Community zu den Themen Datenbanken, Data Warehouse & Business Intelligence. Nimm teil an der Community von Datenbanken-verstehen.de und tausch dich mit deinen Fragen und Lösungen mit anderen Nutzern aus.

Als registrierter Benutzer genießt Du viele Vorteile, wie

  • den vollen Zugang zu allen Foren und Unterforen
  • Kostenloses Lernmaterial inkl. Lösungen zum Thema Datenbanken
  • Zugriff auf DB-Tutorials, Best Practices und SQL-Snippets

Bevor Du einen Beitrag verfassen möchtest, kannst Du dich einfach kostenlos registrieren.

oder Einloggen mit



Beachte bitte die Forenregeln von Datenbanken-verstehen.de. Wir wünschen Dir viel Spaß im Datenbank Forum! - Dein Datenbanken-verstehen.de-Team

Alternative für T-SQL Cursor (Ticket/Gutschein)

Alles zur Datenbankentwicklung im Microsoft SQL Server-Umfeld...

Alternative für T-SQL Cursor (Ticket/Gutschein)

Beitragvon Michael85 » Sa 14. Nov 2015, 17:52

Hallo zusammen,

kurz zu meiner Person:
Ich heiße Michael und arbeite für eine Event-Agentur.
Habe nun einen neuen Job angefangen und bekomme gleich die großen Brocken :o

Ich habe folgendes Problem:

Als Event-Agentur verkaufen wir Tickets, was sonst? Ab und zu verschenken wir auch Gutscheine, mit denen man Boni für ein Ticket bekommt.

Nun habe ich eine Tabelle mit ca. 300 000 Tickets und 100 000 Gutscheinen.
Jeder Gutschein darf maximal einem Ticket zugeordnet werden.

Derzeit verwenden wir dafür einen Cursor, der mehrere Stunden rattert und folgende Logik ausführt:

1.Hole dir aus der Tabelle ein Ticket
2.Hole dir einen Gutscheincode, der noch nicht verwendet wurde
3.Update das Ticket mit dem Gutscheincode
4.Setze den Gutscheincode auf aktiv

Nun habe ich gelesen, dass man eigentlich keine Cursor verwenden soll.
Nun wäre meine Frage wie ich das besser machen kann?
Michael85
 
Beiträge: 5
Registriert: So 1. Dez 2013, 20:36

Re: Alternative für T-SQL Cursor (Ticket/Gutschein)

Beitragvon chuky666 » So 15. Nov 2015, 19:29

Abend :)

es gibt da einige Möglichkeiten.... man müsste jetzt nur wissen wie eure Daten gepflegt und aufgebaut sind. Spontan fallen mir da ein: Temp table, CTE(Common table expression) usw ein....

Ich persönlich, natürlich aus dem bauch raus^^, würde die reihenfolge ein wneig anders gestalten und mit Transaction arbeiten.


1.Hole dir einen Gutscheincode, der noch nicht verwendet wurde
2.Setze den Gutscheincode auf aktiv
3.Hole dir aus der Tabelle ein Ticket
4.Update das Ticket mit dem Gutscheincode

Das schön in einer Transaction gepackt sollte schick sein :)

grüßeG
MCSA SQL-Server 2016; DBA
chuky666
 
Beiträge: 57
Registriert: Mo 28. Sep 2015, 21:04

Re: Alternative für T-SQL Cursor (Ticket/Gutschein)

Beitragvon RainerH » Mi 18. Nov 2015, 23:56

Hallo zusammen,

mit CTEs wirst Du nicht weit kommen, wenn Du Updates auf zwei Tabellen durchführen musst.
Ich würde folgendes tun:

1. Falls Du keine RowNumber bei deinen Tickets hast, dann füge sie "over (order by)" hinzu und packe das Set in eine Temp-Tabelle.
2. Dann hole alle deine Gutscheine einmalig (Distinct) in eine weitere Temp-Tabelle.
3. Auf diese zweite Temp-Tabelle baust Du notfalls auch eine RowNumber ein.
4. Nun verbindest Du die Tabellen über einen INNER JOIN mittels der RowNumber und gibt dir von Tabelle 1, dass Ticket und von Tabelle 2 den Gutscheincode zurück.
5. Nun kommen die Updates:
- Update die echte Ticket-Tabelle mit dem Gutscheincode, gejoined über TicketNr vom Orginial und Temp
- Nun update die Gutschein-Tabelle, dass der Code benutzt wird. Der JOIN geht über die Original Gutschein Tabelle und der zweiten Temp-Tabelle. Das schöne ist jetzt, dass auch doppelte Gutscheine als verwendet markiert werden, werden aber durch das DISTINCT nur ein mal wirklich in der wichtigen Ticket-Tabelle angewendet.

Ach ja, packe das bitte ganze in eine Transaction! Sonst klappt das nicht.
Und am Ende bitte noch alle Temp-Tabellen wieder löschen.

Gruß,
Rainer
Nimm NICHTS persönlich -- alles ist Feedback...
RainerH
 
Beiträge: 230
Registriert: Fr 1. Nov 2013, 17:58

Re: Alternative für T-SQL Cursor (Ticket/Gutschein)

Beitragvon Michael85 » Sa 21. Nov 2015, 16:04

Hallo chucky666,
hallo Rainer,

eure Ideen sind echt ein Knüller. Genau das habe ich gesucht - und ja, es funktioniert :D :D :D
Vielen Dank euch Beiden...

Gruß,
Michael
Michael85
 
Beiträge: 5
Registriert: So 1. Dez 2013, 20:36


Zurück zu Microsoft SQL Server

 


  • Related topics
    Antworten
    Zugriffe
    Letzter Beitrag

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron
  • Jetzt Fan werden
  • Newsletter abonnieren? Hier anmelden!

    Alle Informationen aus dem Portal, Blog und Forum in einem Newsletter!

    E-Mail-Adresse: