Just nu i M3-nätverket
Gå till innehåll

Sql fråga som inte fungerar med Where clause?


Wippika

Rekommendera Poster

Hej,

 

Min kompetens om SQl är väldigt begränsade och antagligen ligger problemet där för jag kan inte se varför denna inte skall fungera..

 

Så fort jag lägger till en where clause så står det bara och tuggar när jag kör den i Sql manager.

 

Första exemplet här fungerar kanon

Select f.file_id, c.company,c.id, cf.filename, cf.updatetime, sr.server_id, s.server_name, at.app_type as app, aa.app_action as appAction,MAX(run_time) as serverRunTime, 
			(select top(1) last_reg from st_filereadings stf2 where stf2.file_id= f.file_id and stf2.server_id = f.server_id order by last_reg desc	) as max_last_reg,	
			(select top(1) stf3.status	from st_filereadings stf3 where stf3.file_id= f.file_id and stf3.server_id = f.server_id order by last_reg desc	) as current_status, 
			(select top(1) stf4.update_time from st_filereadings stf4 where stf4.file_id= f.file_id and stf4.server_id = f.server_id order by update_time desc	) as app_update 
			from st_filereadings f left join st_customer_files cf ON cf.id = f.file_id left join st_customers c ON c.id = cf.customer_id left join st_customer_groups cg ON cg.id = cf.customer_id 
			left join st_servers s ON s.id = f.server_id Left join st_serverreadings sr ON sr.server_id = f.server_id Left join st_app_type at ON at.id = f.app_type Left join st_app_action aa ON aa.id = f.app_action 

			group by f.file_id, c.company,c.id, cf.filename, cf.updatetime, f.server_id,s.server_name, sr.server_id,at.app_type, aa.app_action 
			Order by c.Company, s.server_name, at.app_type,app_update

 

Nu när jag bara lagt på "Where cf.dashboard=1" så tuggar det bara..

Select f.file_id, c.company,c.id, cf.filename, cf.updatetime, sr.server_id, s.server_name, at.app_type as app, aa.app_action as appAction,MAX(run_time) as serverRunTime, 
			(select top(1) last_reg from st_filereadings stf2 where stf2.file_id= f.file_id and stf2.server_id = f.server_id order by last_reg desc	) as max_last_reg,	
			(select top(1) stf3.status	from st_filereadings stf3 where stf3.file_id= f.file_id and stf3.server_id = f.server_id order by last_reg desc	) as current_status, 
			(select top(1) stf4.update_time from st_filereadings stf4 where stf4.file_id= f.file_id and stf4.server_id = f.server_id order by update_time desc	) as app_update 
			from st_filereadings f left join st_customer_files cf ON cf.id = f.file_id left join st_customers c ON c.id = cf.customer_id left join st_customer_groups cg ON cg.id = cf.customer_id 
			left join st_servers s ON s.id = f.server_id Left join st_serverreadings sr ON sr.server_id = f.server_id Left join st_app_type at ON at.id = f.app_type Left join st_app_action aa ON aa.id = f.app_action 
			where cf.dashboard = '1' 
			group by f.file_id, c.company,c.id, cf.filename, cf.updatetime, f.server_id,s.server_name, sr.server_id,at.app_type, aa.app_action 
			Order by c.Company, s.server_name, at.app_type,app_update

 

Som synes så har jag precis lärt mig Subselect :)

Vet att det kanske inte ät rätt sätt att använda men det har fungerat bra och det enda jag vill uppnå är att bara plocka alla läsningar där dashboard fältet är satt till true.

 

Huvudtabellen är st_filereadings där jag hämtar den senaste avläsningar och kopplar på lite stödtabeller...

Mvh

Länk till kommentar
Dela på andra webbplatser

Två kommentarer här.

 

När du lägger på ditt villkor i where-clausen, Where cf.dashboard=1, så upphör din left outer join vara outer, det blir alltså likställt med

...from st_filereadings f join st_customer_files cf....

 

Vill du ha en left outer join får du flytta cf.dashboard=1 till join-villkoret, dvs

from st_filereadings f left join st_customer_files cf ON cf.id = f.file_id and cf.dashboard=1.

 

När det gäller GROUP BY finns det en generell regel (något förenklad) om att varje kolumn i SELECT-listan ska antingen vara med i GROUP BY-listan eller vara argument till aggregat-funktion (MAX, MIN, SUM etc).

 

 

Om du justerar din fråga enligt ovan, "tuggar" den fortfarande då?

Länk till kommentar
Dela på andra webbplatser

Hej,,

tack för ditt svar.

 

Jag har nu ändrat och flyttat villkoret men det lika lång tid ändå.

1:50 min tar hela frågan och huduvdtabellen st_filereadings innehåller inte mer än 65 000 rader..

Select f.file_id, c.company,c.id, cf.filename, cf.updatetime, sr.server_id, s.server_name, at.app_type as app, aa.app_action as appAction,MAX(run_time) as serverRunTime, 
			(select top(1) last_reg from st_filereadings stf2 where stf2.file_id= f.file_id and stf2.server_id = f.server_id order by last_reg desc	) as max_last_reg,	
			(select top(1) stf3.status	from st_filereadings stf3 where stf3.file_id= f.file_id and stf3.server_id = f.server_id order by last_reg desc	) as current_status, 
			(select top(1) stf4.update_time from st_filereadings stf4 where stf4.file_id= f.file_id and stf4.server_id = f.server_id order by update_time desc	) as app_update 
			from st_filereadings f inner join st_customer_files cf ON cf.id = f.file_id and cf.dashboard = 1 inner join st_customers c ON c.id = cf.customer_id inner join st_customer_groups cg ON cg.id = cf.customer_id 
			inner join st_servers s ON s.id = f.server_id inner join st_serverreadings sr ON sr.server_id = f.server_id inner join st_app_type at ON at.id = f.app_type inner join st_app_action aa ON aa.id = f.app_action 
			group by f.file_id, c.company,c.id, cf.filename, cf.updatetime, f.server_id,s.server_name, sr.server_id,at.app_type, aa.app_action 
			Order by c.Company, s.server_name, at.app_type,app_update

Länk till kommentar
Dela på andra webbplatser

Det är alltså när du lägger till villkoret cf.dashboard = 1 som det börjar gå väldigt långsamt?

 

Hur många rader har tabellen st_customer_files?

 

Finns det något index på kolumnen dashboard? Om inte, testa att skapa ett och se om frågan går snabbare.

 

(Om det inte går snabbare bör du ta bort indexet. Oanvända index slöar ner systemet i onödan.)

Länk till kommentar
Dela på andra webbplatser

Japp, helt riktigt. Så fort jag lägger på det villkoret så slöar det ner..

Utan det så går det fint.

 

Prövade med index men gjorde inte så mycket. st_customer_files har bara 27 rader.

 

Kan inte fatta, detta är ju väldit basic grejer jag använder nu väll. Tycker man har left join hur mycket som helst utan problem tidigare...??

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...