Vinnaren i pepparkakshustävlingen!
2021-08-06, 08:38
  #1
Medlem
dengo.dajordens avatar
Jag har en sql med EN sammanhåll som fungerar fint:

Sammanhåll:
Kod:
sbh_afl_v.opgave_search_reason.estimatesproperty_id_ice = gis_eog.estimatesproperty.estimatespropertyidice

Kod:
select
	gis_eog.estimatesproperty.juridiskunderkategoriid,
	sbh_afl_v.opgave_search_reason.reason
from
	gis_eog.estimatesproperty
full outer join sbh_afl_v.opgave_search_reason on
	sbh_afl_v.opgave_search_reason.estimatesproperty_id_ice = gis_eog.estimatesproperty.estimatespropertyidice
where
	( not (sbh_afl_v.opgave_search_reason.estimatesproperty_id_ice is not null
		or gis_eog.estimatesproperty.estimatespropertyidice is not null
		or (gis_eog.estimatesproperty.juridiskunderkategoriid >= 1191
			and gis_eog.estimatesproperty.juridiskunderkategoriid <= 1199 ) ) )

Vill implementera en liknande sql som har 2 sammanhåll enligt:

Sammanhåll 1:
Kod:
kst_volatile.propertyme_i_scope.estimatesproperty_ice_id_mk4v2 = gis_eog.estimatesproperty.estimatespropertyidice
Sammanhåll 2:
Kod:
gis_eog.estimatesproperty.estimatespropertyidice = gis_model.estimatesforslag.estimatespropertyidice

Kod:
select
	gis_model.estimatesforslag.estimatespropertyidice,
	gis_model.estimatesforslag.soilvalueafrundet,
	gis_model.estimatesforslag.propvalue,
	gis_eog.estimatesproperty.juridiskunderkategoriid,
	gis_eog.estimatesproperty.juridiskkategoriid,
	gis_eog.estimatesproperty.propertysnummer,
	gis_eog.estimatesproperty.areanummer,
	kst_volatile.propertyme_i_scope.reduced_scope_r3
from
	gis_model.estimatesforslag,
	gis_eog.estimatesproperty,
	kst_volatile.propertyme_i_scope
full outer join gis_model.estimatesforslag on
	kst_volatile.propertyme_i_scope.estimatesproperty_ice_id_mk4v2 = gis_eog.estimatesproperty.estimatespropertyidice
full outer join gis_model.estimatesforslag on
	gis_eog.estimatesproperty.estimatespropertyidice = gis_model.estimatesforslag.estimatespropertyidice
where
	( not (    	gis_eog.estimatesproperty.estimatespropertyidice is not null
		or gis_model.estimatesforslag.estimatespropertyidice is not null
		or kst_volatile.propertyme_i_scope.estimatesproperty_ice_id_mk4v2 is not null
		or (gis_model.estimatesforslag.estimatespropertyidice >= 10000000
			and gis_model.estimatesforslag.estimatespropertyidice <= 99999999
			and gis_model.estimatesforslag.soilvalueafrundet>0
			and gis_model.estimatesforslag.propvalue>0
			and gis_eog.estimatesproperty.juridiskunderkategoriid in (1110, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199)
				and gis_eog.estimatesproperty.juridiskkategoriid = 1100
				and gis_eog.estimatesproperty.propertysnummer >= 1
				and gis_eog.estimatesproperty.propertysnummer <= 9999999
				and gis_eog.estimatesproperty.areanummer >= 101 gis_eog.estimatesproperty.areanummer <= 860
				and kst_volatile.propertyme_i_scope.reduced_scope_r3 = '1')) )	

Det ger en error:

Checkar jag syntaxen online får jag:
You have an error in your SQL syntax; it seems the error is around:
'outer join gis_model.estimatesforslag on kst_volatile.propertyme_i_scope.estimat'


Kan någon se vad felet är?

I grunden är frågan hur bygger jag sql:n med 2 sammanhåll när jag har en sql fint fungerande med en (1) sammanhåll. Sorry om jag använder fel terminologi eller om felet är basic för er.
__________________
Senast redigerad av dengo.dajorden 2021-08-06 kl. 08:41.
Citera
2021-08-06, 10:30
  #2
Moderator
Pontiac-Garages avatar
Citat:
Ursprungligen postat av dengo.dajorden
Jag har en sql med EN sammanhåll som fungerar fint:

Sammanhåll:
Kod:
sbh_afl_v.opgave_search_reason.estimatesproperty_id_ice = gis_eog.estimatesproperty.estimatespropertyidice

Kod:
select
	gis_eog.estimatesproperty.juridiskunderkategoriid,
	sbh_afl_v.opgave_search_reason.reason
from
	gis_eog.estimatesproperty
full outer join sbh_afl_v.opgave_search_reason on
	sbh_afl_v.opgave_search_reason.estimatesproperty_id_ice = gis_eog.estimatesproperty.estimatespropertyidice
where
	( not (sbh_afl_v.opgave_search_reason.estimatesproperty_id_ice is not null
		or gis_eog.estimatesproperty.estimatespropertyidice is not null
		or (gis_eog.estimatesproperty.juridiskunderkategoriid >= 1191
			and gis_eog.estimatesproperty.juridiskunderkategoriid <= 1199 ) ) )

Vill implementera en liknande sql som har 2 sammanhåll enligt:

Sammanhåll 1:
Kod:
kst_volatile.propertyme_i_scope.estimatesproperty_ice_id_mk4v2 = gis_eog.estimatesproperty.estimatespropertyidice
Sammanhåll 2:
Kod:
gis_eog.estimatesproperty.estimatespropertyidice = gis_model.estimatesforslag.estimatespropertyidice

Kod:
select
	gis_model.estimatesforslag.estimatespropertyidice,
	gis_model.estimatesforslag.soilvalueafrundet,
	gis_model.estimatesforslag.propvalue,
	gis_eog.estimatesproperty.juridiskunderkategoriid,
	gis_eog.estimatesproperty.juridiskkategoriid,
	gis_eog.estimatesproperty.propertysnummer,
	gis_eog.estimatesproperty.areanummer,
	kst_volatile.propertyme_i_scope.reduced_scope_r3
from
	gis_model.estimatesforslag,
	gis_eog.estimatesproperty,
	kst_volatile.propertyme_i_scope
full outer join gis_model.estimatesforslag on
	kst_volatile.propertyme_i_scope.estimatesproperty_ice_id_mk4v2 = gis_eog.estimatesproperty.estimatespropertyidice
full outer join gis_model.estimatesforslag on
	gis_eog.estimatesproperty.estimatespropertyidice = gis_model.estimatesforslag.estimatespropertyidice
where
	( not (    	gis_eog.estimatesproperty.estimatespropertyidice is not null
		or gis_model.estimatesforslag.estimatespropertyidice is not null
		or kst_volatile.propertyme_i_scope.estimatesproperty_ice_id_mk4v2 is not null
		or (gis_model.estimatesforslag.estimatespropertyidice >= 10000000
			and gis_model.estimatesforslag.estimatespropertyidice <= 99999999
			and gis_model.estimatesforslag.soilvalueafrundet>0
			and gis_model.estimatesforslag.propvalue>0
			and gis_eog.estimatesproperty.juridiskunderkategoriid in (1110, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199)
				and gis_eog.estimatesproperty.juridiskkategoriid = 1100
				and gis_eog.estimatesproperty.propertysnummer >= 1
				and gis_eog.estimatesproperty.propertysnummer <= 9999999
				and gis_eog.estimatesproperty.areanummer >= 101 gis_eog.estimatesproperty.areanummer <= 860
				and kst_volatile.propertyme_i_scope.reduced_scope_r3 = '1')) )	

Det ger en error:

Checkar jag syntaxen online får jag:
You have an error in your SQL syntax; it seems the error is around:
'outer join gis_model.estimatesforslag on kst_volatile.propertyme_i_scope.estimat'


Kan någon se vad felet är?

I grunden är frågan hur bygger jag sql:n med 2 sammanhåll när jag har en sql fint fungerande med en (1) sammanhåll. Sorry om jag använder fel terminologi eller om felet är basic för er.

Lite svårt att felsöka utan att se datan du faktiskt jobbar mot, men överlag är det inte bra att köra flera joins samtidigt då det är lätt hänt att du får fel i outputen, i synnerhet om du (som i din kod) har ett antal villkor för filtreringen. Dock ser jag att du i koden inte är konsekvent vilken tabell du "bygger på" i dina joins utan blandar:

Citat:
full outer join gis_model.estimatesforslag on
kst_volatile.propertyme_i_scope.estimatesproperty_ ice_id_mk4v2 = gis_eog.estimatesproperty.estimatespropertyidice
full outer join gis_model.estimatesforslag on
gis_eog.estimatesproperty.estimatespropertyidice = gis_model.estimatesforslag.estimatespropertyidice

Ska du bygga på en befintlig tabell genom att joina den med en annan måste man alltså hålla sig till samma tabell, i detta fall har du såväl två olika grundtabeller som du bygger på samt två olika nycklar. Gissar att det är kst_volatile.propertyme_i_scope du vill bygga vidare på, snarare än att bygga på flera tabeller samtidigt.

Dessutom joinar du på gis_model.estimatesforslag två gånger, vilket inte heller går. Ska du joina anger du alla kolumner från tabell nr 2 som du vill ha, istället för att joina flera gånger. Då det är ett antal problem i din kod finns flera faktorer som kan ligga bakom felet du nämner, men gissar att detta är den huvudsakliga förklaringen till felmeddelandet.

En betydligt bättre approach är att du skapar en tillfällig tabell (t.ex. ett tabellobjekt) där du lagrar lite data i taget, t.ex. joinar två tabeller samt filtrerar ut data av intresse. För nästa påbyggnad joinar du detta tabellobjekt med nästa tabell du vill bygga på, samt kör filtrering nr 2 i samband med det. Det finns rätt många approacher man skulle kunna använda men så hade jag gjort för att undvika att koden blir rörig och svår att överblicka, som du märker är det svårt att felsöka koden lite i taget när du har en klumpmassa med kod där mer än ett fel finns.
Citera
2021-08-06, 10:57
  #3
Medlem
dengo.dajordens avatar
Super, tack för ditt svar!

Orsaken till att det blir inkonsekvenser är att jag ändrade lite kolumnnamn innan jag gör min sql offentlig.

God idé med att använda extra tabeller som mellansteg.

Tabellen kst_volatile.propertyme_i_scope är med som namnet indikerar för att söka på data som är i scope för denna test dvs inte söka i hela databasen men man kanske kan utelämna den biten i ett inledande skede och lägga till det senare. Utan den tabell ger queryn mening (om det skulle fungera). Jag skulle även kunna skapa en mellantabell med det som är i scope.

Jag har aldrig haft flera joins men vet att det finns i db andra likadana joins som fungerar fint men som du säger blir det svårt att genomskåda.

Jag skulle vara glad för ett skolexempel med flera joins i samma statement för att få inspiration och se hur det bör se ut. Kanske någon har en sådan.
Citera
2021-08-06, 11:11
  #4
Medlem
Citat:
Ursprungligen postat av dengo.dajorden

Jag skulle vara glad för ett skolexempel med flera joins i samma statement för att få inspiration och se hur det bör se ut. Kanske någon har en sådan.

Ja, w3schools t.ex.
Citera
2021-08-06, 12:47
  #5
Moderator
Protons avatar
Citat:
Ursprungligen postat av dengo.dajorden
Jag har en sql med EN sammanhåll som fungerar fint:

Sammanhåll:
Kod:
sbh_afl_v.opgave_search_reason.estimatesproperty_id_ice = gis_eog.estimatesproperty.estimatespropertyidice

Kod:
select
	gis_eog.estimatesproperty.juridiskunderkategoriid,
	sbh_afl_v.opgave_search_reason.reason
from
	gis_eog.estimatesproperty
full outer join sbh_afl_v.opgave_search_reason on
	sbh_afl_v.opgave_search_reason.estimatesproperty_id_ice = gis_eog.estimatesproperty.estimatespropertyidice
where
	( not (sbh_afl_v.opgave_search_reason.estimatesproperty_id_ice is not null
		or gis_eog.estimatesproperty.estimatespropertyidice is not null
		or (gis_eog.estimatesproperty.juridiskunderkategoriid >= 1191
			and gis_eog.estimatesproperty.juridiskunderkategoriid <= 1199 ) ) )

Vill implementera en liknande sql som har 2 sammanhåll enligt:

Sammanhåll 1:
Kod:
kst_volatile.propertyme_i_scope.estimatesproperty_ice_id_mk4v2 = gis_eog.estimatesproperty.estimatespropertyidice
Sammanhåll 2:
Kod:
gis_eog.estimatesproperty.estimatespropertyidice = gis_model.estimatesforslag.estimatespropertyidice

Kod:
select
	gis_model.estimatesforslag.estimatespropertyidice,
	gis_model.estimatesforslag.soilvalueafrundet,
	gis_model.estimatesforslag.propvalue,
	gis_eog.estimatesproperty.juridiskunderkategoriid,
	gis_eog.estimatesproperty.juridiskkategoriid,
	gis_eog.estimatesproperty.propertysnummer,
	gis_eog.estimatesproperty.areanummer,
	kst_volatile.propertyme_i_scope.reduced_scope_r3
from
	gis_model.estimatesforslag,
	gis_eog.estimatesproperty,
	kst_volatile.propertyme_i_scope
full outer join gis_model.estimatesforslag on
	kst_volatile.propertyme_i_scope.estimatesproperty_ice_id_mk4v2 = gis_eog.estimatesproperty.estimatespropertyidice
full outer join gis_model.estimatesforslag on
	gis_eog.estimatesproperty.estimatespropertyidice = gis_model.estimatesforslag.estimatespropertyidice
where
	( not (    	gis_eog.estimatesproperty.estimatespropertyidice is not null
		or gis_model.estimatesforslag.estimatespropertyidice is not null
		or kst_volatile.propertyme_i_scope.estimatesproperty_ice_id_mk4v2 is not null
		or (gis_model.estimatesforslag.estimatespropertyidice >= 10000000
			and gis_model.estimatesforslag.estimatespropertyidice <= 99999999
			and gis_model.estimatesforslag.soilvalueafrundet>0
			and gis_model.estimatesforslag.propvalue>0
			and gis_eog.estimatesproperty.juridiskunderkategoriid in (1110, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199)
				and gis_eog.estimatesproperty.juridiskkategoriid = 1100
				and gis_eog.estimatesproperty.propertysnummer >= 1
				and gis_eog.estimatesproperty.propertysnummer <= 9999999
				and gis_eog.estimatesproperty.areanummer >= 101 gis_eog.estimatesproperty.areanummer <= 860
				and kst_volatile.propertyme_i_scope.reduced_scope_r3 = '1')) )	

Det ger en error:

Checkar jag syntaxen online får jag:
You have an error in your SQL syntax; it seems the error is around:
'outer join gis_model.estimatesforslag on kst_volatile.propertyme_i_scope.estimat'


Kan någon se vad felet är?

I grunden är frågan hur bygger jag sql:n med 2 sammanhåll när jag har en sql fint fungerande med en (1) sammanhåll. Sorry om jag använder fel terminologi eller om felet är basic för er.
Om du sätter ett alias på dina tabeller, funkar det bättre då?

Kod:
full outer join gis_model.estimatesforslag gme1 on
	gme1.kst_volatile.propertyme_i_scope.estimatesproperty_ice_id_mk4v2 = gis_eog.estimatesproperty.estimatespropertyidice
full outer join gis_model.estimatesforslag gme22 on
	gme2.gis_eog.estimatesproperty.estimatespropertyidice = gis_model.estimatesforslag.estimatespropertyidice
och sen får du ändra i wheren med såklart för att dina alias ska användas.

Det andra alternativet jag kommer på nu är att göra 2 frågor av det där och sedan UNIONa ihop dem. På det sättet kan du köra de två frågorna separat och få vardera att funka, för att sedan sätta ihop de 2 fungerande delarna med en UNION. Aningen klumpigt kanske, men värt ett försök imo?
Citera
2021-08-06, 13:35
  #6
Moderator
Pontiac-Garages avatar
Citat:
Ursprungligen postat av dengo.dajorden
Super, tack för ditt svar!

Orsaken till att det blir inkonsekvenser är att jag ändrade lite kolumnnamn innan jag gör min sql offentlig.

God idé med att använda extra tabeller som mellansteg.

Tabellen kst_volatile.propertyme_i_scope är med som namnet indikerar för att söka på data som är i scope för denna test dvs inte söka i hela databasen men man kanske kan utelämna den biten i ett inledande skede och lägga till det senare. Utan den tabell ger queryn mening (om det skulle fungera). Jag skulle även kunna skapa en mellantabell med det som är i scope.

Jag har aldrig haft flera joins men vet att det finns i db andra likadana joins som fungerar fint men som du säger blir det svårt att genomskåda.

Jag skulle vara glad för ett skolexempel med flera joins i samma statement för att få inspiration och se hur det bör se ut. Kanske någon har en sådan.

"Vanlig" multiple join kan du göra genom att bara bygga på en tabell med flera andra tabeller, där varje enskild tabell har ett alias. Denna sida ger rätt bra exempel:

https://www.sqlshack.com/sql-multipl...with-examples/

Personligen hade jag dock gått direkt på att bygga en tillfällig tabell genom att joina två tabeller av intresse, och sedan joinat denna för varje gång man vill lägga på en join. Detta gör det avsevärt lättare att kontrollkolla att man får rätt data ett steg i taget. Framförallt om man jobbar med stora datamängder uppstår ett behov av att felsöka datafiltreringen då och då och inte bara titta på slutresultatet.

Slängde ihop denna kod nu och det skulle väl bli något i stil med:

Citat:
-- Skapa en tillfällig tabell
Declare @temp_tabell Table (
kolumn1 varchar(10),
kolumn2 varchar(10),
kolumn3 varchar(10)
)

-- Fyll på tabellen med data från tabell 1 och tabell 2
Insert @temp_tabell
select kolumn1, tabell2.kolumn2
from tabell1
full join tabell2
on tabell1.nyckel1 = tabell2.nyckel1; -- join nr 1

-- Joina den tillfälliga tabellen med tabell 3
select
kolumn1,
kolumn2,
tabell3.kolumn3
from @temp_tabell temp_data -- sätt alias för den tillfälliga tabellen
full join tabell3
on temp_data.nyckel2 = tabell3.nyckel2; -- join nr 2
__________________
Senast redigerad av Pontiac-Garage 2021-08-06 kl. 13:38.
Citera
2021-08-06, 15:04
  #7
Medlem
dengo.dajordens avatar
Super! Proton och Pontiac-Garage jobbar så det knakar med era förslag. Återkommer med feedback.

tack PeggyOlson för linken
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback