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-Key: 373641

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

Printed on: April 25, 2024 at 01:04 o'clock

Member: ukulele-7
Solution ukulele-7 May 11, 2018 at 12:00:19 (UTC)
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  
Member: em-pie
Solution em-pie May 11, 2018 updated at 12:11:40 (UTC)
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
Member: CreamyCewie
CreamyCewie May 14, 2018 updated at 07:06:50 (UTC)
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
Member: em-pie
Solution em-pie May 14, 2018 at 07:38:07 (UTC)
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
Member: CreamyCewie
CreamyCewie May 14, 2018 at 07:49:41 (UTC)
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?
Member: em-pie
Solution em-pie May 14, 2018 at 09:20:04 (UTC)
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?
Member: CreamyCewie
CreamyCewie May 14, 2018 at 09:29:48 (UTC)
Goto Top
Member: em-pie
Solution em-pie May 14, 2018 updated at 09:34:55 (UTC)
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
Member: CreamyCewie
CreamyCewie May 14, 2018 at 12:37:37 (UTC)
Goto Top
Auch mit den 2 Hochkommata bekomme ich eine leere Ergebnissmenge face-sad
Member: em-pie
Solution em-pie May 14, 2018 at 13:37:00 (UTC)
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)...
Member: CreamyCewie
CreamyCewie May 15, 2018 at 11:49:40 (UTC)
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