Zum Inhalt wechseln


Foto

SQL Query erstellen

MS SQL

  • Bitte melde dich an um zu Antworten
19 Antworten in diesem Thema

#1 roga

roga

    Newbie

  • 7 Beiträge

 

Geschrieben 22. September 2015 - 06:25

Hallo liebes Forum,

 

seit einiger Zeit beschäftige ich mich mit SQL bzw. möchte es mir selbst beibringen. An einer mir selbst gestellten Aufgabe scheitere ich aber kläglich. Nun suche ich hier in diesem Forum um Hilfe.

 

Mein Problem:

 

ich habe eine Tabelle "tblKunden" und eine Tabelle "tblArtikel". Beide Tabellen sind über eine Beziehungstabelle m:n miteinander verknüpft. Beide Tabellen (Kunden und Artikel) besitzen als Primärkey einen eindeutigen Integerwert. Beide Primärkeys sind in der Beziehungstabelle als Fremdkey festgelegt.

 

Nun wollte ich eine Abfrage machen, von der ich alle gekauften Artikel eines bestimmten Kunden (z.B. K-Nr. 13) erhalte. Das hat auch mit folgender SQL-Abfrage funktioniert:

 

SELECT tblArtikel.artikel_bez, tblArtikel.atikel_nr

FROM tblKunden_Artikel INNER JOIN tblArtikel ON tblKunden_Artikel.artikel_id = tblArtikel.artikel_id

WHERE tblKunden.kunden_nr = 13

 

Eine weitere Abfrage sollte mir all die Artikel liefern, welche ein bestimmter Kunde noch NICHT gekauft hat. Und genau hier scheitere ich, leider :-(

 

Ich möchte als Erbegnis eine Liste mit der Artikel-Bezeichnung und Nummer erhalten, die der Kunden also noch NICHT gekauft hat, doch wie muss eine soche Abfrage aussehen??

 

PS: ich bin schon dabei, mich durch verschiedenste Tutorials betreffend dem Thema SQL durchzuschlagen, nur gefunkt hat's bislang noch nicht so richtig.

Es fehlt mir halt ein "Lehrer" :-)

 

Für gut gemeinte Tipps und Ratschläge bin ich sehr dankbar!

 

Grüsse

ROGA



#2 zahni

zahni

    Expert Member

  • 16.520 Beiträge

 

Geschrieben 22. September 2015 - 06:43

Hallo uns willkommen im Forum,

 

hört sich zwar wie eine Übungsaufgabe  an, trotzdem mal ein Denkanstoß:

 

Selektiere nur von tblArtikel (select * from, oder so).

 

Nun brauchst Du noch eine Kopie Deiner Query, in der Du nur tblArtikel.artikel_id selektierst.

 

Im Where-Statement der 1. Quey schreibst Du tblArtikel.artikel_id  not in (...)

 

Die Punkte darfst Du Dir jetzt ausdenken...


Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!


#3 roga

roga

    Newbie

  • 7 Beiträge

 

Geschrieben 22. September 2015 - 07:23

Hallo Zahni,

 

Vielen Dank für den schnellen "Denkanstoss". Hab mich gleich hingesetzt und mich damit beschäftigt. Leider bekomme ich noch nicht das gewüschte Ergebnis.

 

Habe ich Deinen "Denkanstoss" so richtig verstanden?

 

SELECT *

FROM tblArtikel

WHERE tblArtikel.Artkel_id not in

(SELECT tblArtikel.Artikel_id FROM tblArtikel)

 

Diese Abfrage liefert mir zwar keinen Fehler aber auch keine Daten :-(

 

Was mich hier etwas verwirrt ist, dass bei Deinem Ansatz keine Verbindung zur Beziehungstabelle gemacht wird. Wie kann ich dann so die Abfrage für einen bestimmten Kunden machen, so wie ich es oben geschildert habe?

 

Stehe ich jetzt total auf dem Schlauch oder gib's noch Hoffnung für mich?

 

Grüsse

ROGA



#4 Cybquest

Cybquest

    Expert Member

  • 1.888 Beiträge

 

Geschrieben 22. September 2015 - 07:31

Pack in den Select in der Klammer mal Deine ganz oben geschriebene Abfrage rein.


My name is Frank, you can say you to me.

#5 roga

roga

    Newbie

  • 7 Beiträge

 

Geschrieben 22. September 2015 - 07:54   Lösung

Hallo Cybquest,

 

Wow!!! Dein Hinweis scheint mich wirklich weiter gebracht zu haben, vielen, vielen Dank!!!!!!

 

Euch beiden nochmals vielen Dank!!!

 

Bis zu meinem nächsten Problem :-) Es wird sicher nicht die letzte Frage sein, die ich hier platzieren werde. Aber dank der kompetenten Unterstützung hier in diesem Forum durch euch, macht es wirklich wieder Spass!!!

 

Ich bin Happyyyyyy ....

 

Grüsse

ROGA



#6 Cybquest

Cybquest

    Expert Member

  • 1.888 Beiträge

 

Geschrieben 22. September 2015 - 08:41

Immer gerne :-)


My name is Frank, you can say you to me.

#7 zahni

zahni

    Expert Member

  • 16.520 Beiträge

 

Geschrieben 22. September 2015 - 09:01

War bei meine Tipp doch zu kompliziert...


Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!


#8 roga

roga

    Newbie

  • 7 Beiträge

 

Geschrieben 22. September 2015 - 12:15

Hallo,

 

ich bin's nochmals :-) Vielleicht hört mir nochmal jemand zu.

 

Mein Problem ist leider nur zur Hälfte gelöst, wie ich jetzt feststellen musste. Wenn ich die obige SQL-Abfrage direkt in einem Query auf dem Datenbankserver mache, dann funktioniert es eigentlich wie erwartet.

 

SELECT *
FROM tblArtikel
WHERE tblArtikel.artikel_id NOT IN

(
SELECT tblArtikel_1.artikel_id
FROM dbo.tblKunden_Artikel AS tblKunden_Artikel_1 INNER JOIN dbo.tblArtikel AS tblArtikel_1
ON tblKunden_Artikel_1.artikel_id = tblArtikel_1.artikel_id
WHERE tblKunden_Artikel_1.kunden_id=16
)

 

Nun wollte ich ich aber diese Abfrage von meinem Test-Programm aus machen, was so leider nicht mehr funktioniert hat, weil die Kunden-ID nicht statisch auf dem Server eingestellt ist, sondern dynamisch von meinem Test-Programm ausgewählt werden kann (soll).

 

Wie schaffe ich es also, die Abfrage so zu erstellen, dass der Server von meiner Kunden-ID kenntnisse erhält???

 

Jetzt stehe ich wirklich auf dem Schlauch :confused:

 

Hoffe, jemand kann mir nochmals einen Denkanstoss verpassen :p

 

Danke und Grüsse

ROGA



#9 zahni

zahni

    Expert Member

  • 16.520 Beiträge

 

Geschrieben 22. September 2015 - 12:48

Dein Problem verstehe ich nicht. Wenn Du etwas programmierst, wirst Du es sicher auch schaffen den Parameter bei der Where-Klausel programmatisch zu füllen.


Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!


#10 Sunny61

Sunny61

    Expert Member

  • 22.248 Beiträge

 

Geschrieben 22. September 2015 - 14:22

Pack deine Abfrage in eine Stored Procedure. In der SP erstellst Du dann ebenfalls einen int-Parameter für die KundenID. Die 16 ersetzt Du dann mit der INT-Variablen.
Im SQL Server Management Studio kann der Aufruf dann so aussehen:
 
EXEC DeineSP 16
Und so muss der Aufruf auch aussehen, wenn Du das aus deinem uns unbekannten Programm aus aufrufen möchtest.

EDIT: Hier gibt es Futter zum erstellen einer SP:
https://msdn.microso...v=sql.120).aspx
http://www.codeproje...rocedure-in-SQL

Bearbeitet von Sunny61, 22. September 2015 - 14:24.

Gruppenrichtlinien: http://www.gruppenrichtlinien.de/

#11 zahni

zahni

    Expert Member

  • 16.520 Beiträge

 

Geschrieben 22. September 2015 - 14:38

Bleibt die Frage der Parameterübergabe ;)


Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!


#12 Sunny61

Sunny61

    Expert Member

  • 22.248 Beiträge

 

Geschrieben 22. September 2015 - 14:40

Bleibt die Frage der Parameterübergabe ;)


Das hängt am uns unbekannten Programm. Bei Acces und VB weiß ich wie es geht. ;)
Gruppenrichtlinien: http://www.gruppenrichtlinien.de/

#13 roga

roga

    Newbie

  • 7 Beiträge

 

Geschrieben 22. September 2015 - 15:32

Hallo Sunny61,

 

Vielen Dank! Bin richtig überrascht, wie schnell das hier abgeht :-)

 

Mein "Unbekanntes" Programm ist ein VB.NET Programm. Auch damit bin ich fleissig am üben. :-)

 

Also, das mit der Stored Procedure habe ich von der Theorie her halbwegs auf die Reihe bekommen, muss damit wohl noch einwenig experimentieren. Werde aber vorher das "Futter" noch genüsslich in mich hineinziehen und danach ordentlich verdauen. Hoffe, ich krieg den rest dann alleine auf die Reihe. Werde über meinen Erfolg/Misserfolg weiter berichten.

 

Danke für die Unterstützung!!!

 

Grüsse

ROGA


Bearbeitet von roga, 22. September 2015 - 15:39.


#14 Sunny61

Sunny61

    Expert Member

  • 22.248 Beiträge

 

Geschrieben 22. September 2015 - 16:28

Hier gibt es noch weitere Infos zu dem Thema:

http://stackoverflow...ess-the-results
https://support.micr...en-us/kb/308049

http://www.codeguru....with-vb.net.htm

Sobald Du ein Query oder eine View mit Parametern füttern möchtest, ist eine SP das Mittel der Wahl. Views würde ich auch nur noch als letztes Mittel sehen, die SPs sind eigentlich immer den Views vorzuziehen.
Gruppenrichtlinien: http://www.gruppenrichtlinien.de/

#15 zahni

zahni

    Expert Member

  • 16.520 Beiträge

 

Geschrieben 22. September 2015 - 17:30

Trotzdem sollte es programmiertechnisch zunächst egal sein, ob ich eine Query, View oder SP mit Parametern verwende. Der Rest ist eher eine Frage des Designs. Persönlich  kenne ich mehr Anwendungen, die keine SPs verwenden, sondern zu 98% dynamisches SQL. Mit gewissen Frameworks geht das auch selten anders. 

Aber ich schweife ab.


Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!




Auch mit einem oder mehreren der folgenden Tags versehen: MS SQL