SQL Anfängerfrage
Geizhals » Forum » Programmierung » SQL Anfängerfrage (10 Beiträge, 415 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
SQL Anfängerfrage
04.03.2017, 19:54:12
Abend, ich hab eine SQL Anfängerfrage. Da ich Anfänger bin hoffe ich mal das ich überhaupt in der Lage bin alle Infos zu geben die nötig sind um meine Frage zu beantworten.

Ich hab mir div Beispiele angeschaut, Video2Brain Video angeschaut, klappt auch alles ganz gut solange man mit den Beispieldatenbanken arbeitet - die wohl so ausgelegt sind das alles recht einfach und übersichtlich bleibt und keine großen Probleme auftreten.

Ich will nun aber mit einer vorhandenen Datenbank ein bissl rumspielen und habe Probleme div Beispiele auf diese meine Datenbank "umzulegen" und ich hoffe ihr könnt mir dabei etwas helfen.



Was will / habe ich:


Ich habe zwei Tabellen, eine nennt sich "Slides", eine weitere nennt sich "Protocols".

In der Slides Tabelle sehe ich welche Slides mit welchem Protokoll abgearbeitet wurden wobei das Protokoll nur mit seiner "ProtokollID" angezeigt wird die natürlich wenig aussagt da es sich einfach um eine Nummer handelt.

In der Protocols Tabelle sehe ich die ProtokollIDs und die dazugehörigen, realen, Namen der Protokolle.


Ich würde aber nun gerne eine Abfrage erstellen die bei jedem Slide die realen Protokollnamen und die Protokoll IDs aus beiden Tabellen anzeigt.

Ich will nun also die Tabelle SLIDES mit der Tabellen PROTOKOLLS verbinden und alle Slides in Verbindung mit dem Realnamen der verwendeten Protokolle sichtbar machen.

Also habe ich mir gedacht (und lacht nun bitte nicht, eh scho wissen, Anfänger) ich verwende INNER JOIN.




Folgende Abfrage habe ich nun erstellt:

SELECT PC.ProtocolID AS 'ProtocolID aus Protocols-Tabelle'
            SL.ProtocolID AS 'ProtocolID aus Slides-Tabelle'
            PC.Name
FROM    Slides.Slide SL INNER JOIN Protocols.Protocol PC ON SL.ProtocolID = Name



So, die Fehlermeldung:

Conversion failed when converting from a a character string to uniqueidentifier.


verwendete Datentypen

Die "ProtocolID" in der Slides.Slide Tabelle hat als Datentyp "uniqueidentifier".
Die "ProtocolID" in der Protocols.Protocol Tabelle hat als Datentyp "uniqueidentifier".
Der "Name" in der Tabelle Protocols.Protocol hat als Datentyp "nvarchar(50)


Ist meine Angabe soweit  verständlich das meine Frage beantwortet werden kann oder fehlen Informationen? Was muss ich nun wo eingeben um mein Ziel zu erreichen? Ist meine Angabe verständlich?









04.03.2017, 19:56 Uhr - Editiert von h-works, alte Version: hier
Antworten PM Übersicht Chronologisch
 
Melden nicht möglich
.
Re: SQL Anfängerfrage
04.03.2017, 20:08:08
Du bist auf dem richtigen Weg.

Beginne beim SQL Statement nicht mit dem SELECT (das machst du als allerletztes) sondern mit dem FROM. Beginnen wir:

FROM Slides.Slide .. ok, ich nehme an du willst die Slides Tabelle, also nehmen wir auch nur die

-> FROM Slides sl (sl ist dabei der Alias über den wir die Tabelle ansprechen könnten; er ist jedoch optional und zum besseren verständnis lassen wir ihn mal weg)
-> INNER JOIN passt (NULLs sollen weggeworfen werden bzw. es gibt wahrscheinlich eh keine)

Womit wollen wir die Tabelle Slides Joinen? Mit Protocols, also

-> FROM Slides INNER JOIN Protocols

Und über welches Attribut hängen nun die beiden Tabellen zusammen. Lt. deiner Aussage müsste das die Spalte ProtocolId sein (die heißt offensichtlich in beiden Tabellen gleich)

-> FROM Slides INNER JOIN Protocols ON Slides.ProtocolId = Protocols.ProtocolId

So, das JOIN ist jetzt vollständig, jetzt widmen wir uns dem SELECT. Was man dazu wissen muss: Bei einem JOIN wird immer das Kreuzprodukt gebildet ("alles mal alles"), d.h. du bekommst eine rieeeeesige Tabelle, die durch das "ON" wieder reduziert wird (natürlich macht das SQL Server schon etwas schlauer). D.h. in unserem Set das wir jetzt haben, haben wir alle Spalten von allen Tabellen - wir suchen uns nun nur noch aus, welche wir brauchen: Protocol.Name

SELECT Protocols.Name, Protocols.ProtocolId, Slides.SlideId

(Das Slides.SlideId habe ich jetzt mal hinzugenommen, du willst doch sicher auch was aus der Slides Tabelle anzeigen lassen, sonst wäre das JOIN ja sinnlos).

Wir basteln das Ganze also zusammen:

SELECT Protocols.Name, Protocols.ProtocolId, Slides.SlideId
FROM Slides INNER JOIN Protocols ON Slides.ProtocolId = Protocols.ProtocolId

im Inner Join siehst du jetzt auch dass die beiden Spalten die verglichen werden denselben Datentyp haben (uniqueidentifier).

Wenn der Sturm losbricht,
verstummen die Einen vor Schrecken,
und die Anderen breiten, einem Adler gleich, die Flügel aus
und schwingen sich empor.

Herzlichen Dank an Raydoo für die Fotos

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
..
Re(2): SQL Anfängerfrage
04.03.2017, 20:17:22
Du bist auf dem richtigen Weg.


...aber der ist steinig *gg*

danke für deine Ausführungen...ich bin im Moment dabei div Beispiele aus dem Lernmaterial auf meine vorhanden Datenbank umzulegen und da gibt's immer wieder kleinere und größere Probleme.

Div Testdatenbanken sind übersichtlich, die Spaltenbezeichnungen sind gut "lesbar", man kann sich recht schnell was vorstellen unter den vorhandenen Daten. Es sind oft nur wenige Datensätze enthalten, alles ist übersichtlich....

Bei meiner Datenbank die ich nun verwende handelt es sich um die DB eines med. Diagnostikgerätes meiner Firma. Da sind div Bezeichnungen verwirrend(er), es ist schwerer zu überblicken und dass dann, in Verbindung mit meinem nicht vorhandenen Wissen machts schwer.

Ich bin an diesem Problem schon länger gesessen weil in meinem Lernmaterial erst VIEL SPÄTER erklärt wurde wie ich mit gleichen Spaltennamen umgehen muss, nämlich durch Angabe der Tabelle, am besten in Form von Tabellenaliasnamen. Also alleine rauszufinden wieso die Abfrage  zu Beginn überhaupt nicht funktioniert hat hat viel Zeit gekostet.

Das Gute: es macht mir Spaß...


Womit wollen wir die Tabelle Slides Joinen? Mit Protocols, also


hier war wohl mein Denkfehler, ich dachte wenn ich die ProtokollID aus der Tabelle Slides mit den Realnamen, die in der Tabelle Protocols hinterlegt sind, verbinden will muss ich dazu auch die Spalte NAMEN der Protocols Tabelle verwenden. Und da lag ich offenbar falsch :-~(

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung