creamycewie
Goto Top

TSQL - Abfrage filtern

Hallo.

Ich habe in meiner Datenbank 3 Tabellen, aus denen ich mittels eines Select-Befehld in Kombination mit einem Inner Join Daten abrufe.
Meine Abfrage:

select concat (B.Belegtyp, B.Belegnummer, ';', B.Adressnummer /*Adressnummer*/ , ';', CONVERT(VARCHAR(10), B.Datum, 104) , ';', L.Firma , ';', L.Zusatz , ';', L.Zusatz2 , ';', L.Strasse  , ';', L.Ort , ';', L.PLZ , ';', K.Telefon1 , ';', K.Telefon2)   
from beleg  as B inner join ADRESS as L on L.Adresstyp = 'QL'+B.Belegnummer inner join KUNDEN as K on B.Adressnummer = K.Nummer  

funktioniert soweit.

Problem dabei: Ich möchte das Ergebniss nur für einen Datensatz erhalten.
Dazu muss ich die Abfrage mittels Where filtern.
Hab ich schion öfter gemacht, funktioniert auch an sich.
Das Problem ist das inner join.
Sobald ich ein Inner Join UND ein Where drin habe, erhalte ich einen Syntaxfehler.

Meine Abfrage mit dem Where-Statement:

select concat (B.Belegtyp, B.Belegnummer, ';', B.Adressnummer /*Adressnummer*/ , ';', CONVERT(VARCHAR(10), B.Datum, 104) , ';', L.Firma , ';', L.Zusatz , ';', L.Zusatz2 , ';', L.Strasse , ';', L.Ort , ';', L.PLZ , ';', K.Telefon1 , ';', K.Telefon2)
from beleg as B inner join ADRESS as L on L.Adresstyp = 'QL'+B.Belegnummer inner join KUNDEN as K on B.Adressnummer = K.Nummer

Ich möchte nur den Datensatz haben, in dem der Belegtyp (B.Belegtyp in belege) = L ist und die Belegnummer (B.Belegnummer in belege) = 18000001


Wie muss ich die Abfrage umbauen, um das gewünschte Ergebniss zu bekommen?


Danke & LG

Content-ID: 373641

Url: https://administrator.de/contentid/373641

Ausgedruckt am: 23.11.2024 um 05:11 Uhr

ukulele-7
Lösung ukulele-7 11.05.2018 um 14:00:19 Uhr
Goto Top
Die gezeigten Abfragen sind identisch und syntaktisch korrekt.

Wie wäre es mit
select concat (B.Belegtyp, B.Belegnummer, ';', B.Adressnummer /*Adressnummer*/ , ';', CONVERT(VARCHAR(10), B.Datum, 104) , ';', L.Firma , ';', L.Zusatz , ';', L.Zusatz2 , ';', L.Strasse , ';', L.Ort , ';', L.PLZ , ';', K.Telefon1 , ';', K.Telefon2)  
from beleg as B inner join ADRESS as L on L.Adresstyp = 'QL'+B.Belegnummer inner join KUNDEN as K on B.Adressnummer = K.Nummer  
WHERE B.Belegtyp = 'L' AND B.Belegnummer = 18000001  
em-pie
Lösung em-pie 11.05.2018 aktualisiert um 14:11:40 Uhr
Goto Top
Moin,

ich vermisse dein "where"...

Und auch, welchen Syntaxfehler du erhältst.

Mache es doch so:
select 
 concat (
  B.Belegtyp
  ,B.Belegnummer, ';',   
  ,B.Adressnummer, ';'  
  ,CONVERT(VARCHAR(10), B.Datum, 104), ';'  
  ,L.Firma, ';'  
  ,L.Zusatz, ';'  
  ,L.Zusatz2, ';'  
  ,L.Strasse, ';'  
  ,L.Ort, ';'  
  ,L.PLZ, ';'  
  ,K.Telefon1, ';'  
  ,K.Telefon2
  )
from 
  beleg as B 
inner join ADRESS as L 
 on L.Adresstyp = 'QL'+B.Belegnummer   
inner join KUNDEN as K 
 on B.Adressnummer = K.Nummer
where 
 b.Belegtyp = 'L'  
 and b.belegnummer = 18000001

Wenn deine Belegnummer allerdings vom Typ Char() ist, musst du
 and b.belegnummer = '18000001'   
schreiben.


Edit: du müsstest im ersten InnerJoin Korrekterweise auch it CONCAT arbeiten
inner join ADRESS as L 
 on L.Adresstyp = CONCAT('QL', B.Belegnummer)  

Gruß
em-pie
CreamyCewie
CreamyCewie 14.05.2018 aktualisiert um 09:06:50 Uhr
Goto Top
Vielen Dank!

Habe zwei mal den gleichen Code gepostet sorry^^
Mein Fehler war, dass das WHERE nicht am Ende des Statements stand.

Das ist mein (nun funktionierendes) Statement:

select 
	concat 
		(
			B.Belegtyp, 
			B.Belegnummer, 
				';',   
			B.Adressnummer, 
				';',   
			CONVERT(VARCHAR(10), B.Datum, 104),
				';',   
			L.Firma, 
				';',   
			L.Zusatz, 
				';',   
			L.Zusatz2, 
				';',  
			L.Strasse, 
				';',   
			L.Ort,
				';',  
			L.PLZ, 
				';',   
			K.Telefon1, 
				';',  
			K.Telefon2
		) 'Waage'   
from beleg  as B 
	inner join ADRESS 
		as L 
			on L.Adresstyp = 'Q'+B.Belegtyp+B.Belegnummer   
	inner join KUNDEN 
		as K 
			on B.Adressnummer = K.Nummer 
where B.Belegnummer = '18000001'   
and B.Belegtyp = 'L'   

Nun habe ich jedoch noch eine Frage:

Mit dem oberen Statement hole ich mir ja daten aus dem Beleg (B.xxx) der Adresstabelle (L.xxxx) und der Kundentabelle (K.xxxx)
Wie muss ich das Statement umbauen, um eine Abfrage reinzubringen? IF funktioniert ja nicht in Select-Statements oder?
Ich müsste das ganze so umbauen:

WENN L.Firma = NULL -> soll der Wert aus B.Firma genommen werden
SONST der Wert von L.Firma

ich habe es nun so versucht:

select 
	concat 
		(
			B.Belegtyp, 
			B.Belegnummer, 
				';',   
			B.Adressnummer, 
				';',   
			CONVERT(VARCHAR(10), B.Datum, 104),
				';',   
			(select case when L.Firma = '' THEN B.Firma ELSE L.Firma from beleg  as B inner join ADRESS as L on L.Adresstyp = 'Q'+B.Belegtyp+B.Belegnummer  where B.Belegnummer = :Belegnummer and B.Belegtyp = :Belegtyp  
), 
				';',   
			L.Zusatz, 
				';',   
			L.Zusatz2, 
				';',  
			L.Strasse, 
				';',   
			L.Ort,
				';',  
			L.PLZ, 
				';',   
			K.Telefon1, 
				';',  
			K.Telefon2
		) 'Waage'   
from beleg  as B 
	inner join ADRESS 
		as L 
			on L.Adresstyp = 'Q'+B.Belegtyp+B.Belegnummer   
	inner join KUNDEN 
		as K 
			on B.Adressnummer = K.Nummer 
where B.Belegnummer = '18000001'   
and B.Belegtyp = 'L'   

hier erhalte ich jedoch einen Syntaxfehler:
SQL Server Fehlernummer: 156
Ole Fehlernummer: -2147217900
Data Access-Fehlernummer: 156
Servername: localhost\TEST
Letzter Fehler: Falsche Syntax in der Nähe des from-Schlüsselworts
Zeile: 2

wie wäre dies zu lösen?

Danke & LG
em-pie
Lösung em-pie 14.05.2018 um 09:38:07 Uhr
Goto Top
Moin,

Du hast dein CASE()-Statement falsch eingesetzt...

und hier noch ein Link bzgl. "null", denn Null ist Null, keine 0 und auch kein Leer face-wink

CASE
 When Firma IS NULL Then B.Firma 
 ELSE L.Firma
END as Firma
CreamyCewie
CreamyCewie 14.05.2018 um 09:49:41 Uhr
Goto Top
Moin,

Danke, doch irgendwas mache ich falsch.

Habe das Statement nun entsprechend umgebaut:

select 
	concat 
		(
			B.Belegtyp, 
			B.Belegnummer, 
				';',   
			B.Adressnummer, 
				';',   
			CONVERT(VARCHAR(10), B.Datum, 104),
				';',   
			(select case when L.Firma IS NULL THEN B.Firma ELSE L.Firma END as Firma from beleg  as B inner join ADRESS as L on L.Adresstyp = 'Q'+B.Belegtyp+B.Belegnummer  where B.Belegnummer = '18000001' and B.Belegtyp = 'L'  
), 
				';',   
			L.Zusatz, 
				';',   
			L.Zusatz2, 
				';',  
			L.Strasse, 
				';',   
			L.Ort,
				';',  
			L.PLZ, 
				';',   
			K.Telefon1, 
				';',  
			K.Telefon2
		) 'Waage'   
from beleg  as B 
	inner join ADRESS 
		as L 
			on L.Adresstyp = 'Q'+B.Belegtyp+B.Belegnummer   
	inner join KUNDEN 
		as K 
			on B.Adressnummer = K.Nummer 
where B.Belegnummer = '18000001'   
and B.Belegtyp = 'L'   

Ich habe hier 2 Test-Datensätze.
1.) Belegnummer 18000001
Hier gibt es einen Wert in L.Firma, ich erhalte auch ein korrektes Ergebniss:
L18000001;200078;18.04.2018;LAD1;LAD2;LAD3;LADstr. 12;LADort;1234;0463 502956;0699 19433100

2.) Belegnummer 18000002
Hier gibt es keinen Wert in L.Firma, es sollte also der Wert aus B.Firma angezeigt werden.
Jedoch ist das Ergebniss komplett leer (NULL)

Ich bekomme jedoch keinen Error

Wo bin ich hier noch falsch?
em-pie
Lösung em-pie 14.05.2018 um 11:20:04 Uhr
Goto Top
Du hast mich oben nicht richtig verstanden.

Las dein ganzes Geraffel mal mit dem
(select case when L.Firma IS NULL THEN B.Firma ELSE L.Firma END as Firma from beleg  as B inner join ADRESS as L on L.Adresstyp = 'Q'+B.Belegtyp+B.Belegnummer  where B.Belegnummer = '18000001' and B.Belegtyp = 'L'  
), 

weg und setze stattdessen 1:1 meinen Schnipsel oben ein.

Um zum Test lasse die einfach mal beide Felder anzeigen:
also einmal L.Firma sowie B.Firma

2.) Belegnummer 18000002
Hier gibt es keinen Wert in L.Firma, es sollte also der Wert aus B.Firma angezeigt werden.
Jedoch ist das Ergebniss komplett leer (NULL)
Ist es jetzt LEER oder NULL, also was wird angezeigt?
CreamyCewie
CreamyCewie 14.05.2018 um 11:29:48 Uhr
Goto Top
em-pie
Lösung em-pie 14.05.2018 aktualisiert um 11:34:55 Uhr
Goto Top
OK, also nicht NULL..

Dann baue doch dein CASE um.
Anstelle von
L.FIRMA IS NULL
einfach ein
L.FIRMA='' (zwei aufeinanderfolgende Hochkommata)


P.S.
Bilder bitte direkt hier hochladen und nicht über einen externen Anbieter face-wink
CreamyCewie
CreamyCewie 14.05.2018 um 14:37:37 Uhr
Goto Top
Auch mit den 2 Hochkommata bekomme ich eine leere Ergebnissmenge face-sad
em-pie
Lösung em-pie 14.05.2018 um 15:37:00 Uhr
Goto Top
Ist denn einfach nur das Feld leer/ Null (was auch immer), oder gibt es per se keinen passenden Datensatz in deinem JOIN?

Wenn letzteres, sollte dir ein LEFT bzw RIGHT-Join helfen (anstelle des INNER JOINs)...
CreamyCewie
CreamyCewie 15.05.2018 um 13:49:40 Uhr
Goto Top
Ich blick nicht durch....

Ich habe es aber nun anders gelöst: ich mache einfach davor eine IF EXIST abfrage und führe dann 2 Befehle aus.

/* Wenn LAD eingetragen ist: Daten mit LAD-Adressdaten schreiben */
IF EXISTS (select * FROM ADRESS WHERE Adresstyp = 'Q'+:Belegtyp+:Belegnummer)  
 BEGIN
 select 
	concat 
		(
			B.Belegtyp, 
			B.Belegnummer, 
				';',   
			B.Adressnummer, 
				';',   
			CONVERT(VARCHAR(10), B.Datum, 104),
				';',   
			L.Firma, 
				';',   
			L.Zusatz, 
				';',   
			L.Zusatz2, 
				';',  
			L.Strasse, 
				';',   
			L.Ort,
				';',  
			L.PLZ, 
				';',   
			K.Telefon1, 
				';',  
			K.Telefon2
		) 'Waage'   
from beleg  as B 
	inner join ADRESS 
		as L 
			on L.Adresstyp = 'Q'+B.Belegtyp+B.Belegnummer   
	inner join KUNDEN 
		as K 
			on B.Adressnummer = K.Nummer 
where B.Belegnummer = :Belegnummer
and B.Belegtyp = :Belegtyp 
 END
 
 /* Wenn LAD NICHT eingetragen ist: Daten mit BEL-Adressdaten schreiben */
 
IF NOT EXISTS (select * FROM ADRESS WHERE Adresstyp = 'Q'+:Belegtyp+:Belegnummer)  
 BEGIN
 select 
	concat 
		(
			B.Belegtyp, 
			B.Belegnummer, 
				';',   
			B.Adressnummer, 
				';',   
			CONVERT(VARCHAR(10), B.Datum, 104),
				';',   
			B.Firma, 
				';',   
			B.Zusatz, 
				';',   
			B.Zusatz2, 
				';',  
			B.Strasse, 
				';',   
			B.Ort,
				';',  
			B.PLZ, 
				';',   
			K.Telefon1, 
				';',  
			K.Telefon2
		) 'Waage'   
from beleg  as B 

	inner join KUNDEN 
		as K 
			on B.Adressnummer = K.Nummer 
where B.Belegnummer = :Belegnummer
and B.Belegtyp = :Belegtyp 
 END

Danke trotzdem für deine Hilfe und Geduld face-smile