devotionMedlem sedan jan. 20013 582 inlägg Hej!
Jag har en SQL-fråga enligt:
SELECT TOP 250
[tblTask].*
FROM
(tblTask inner join tblusers
on
tbltask.[user] = tblusers.[name])
inner join tblworkgroups
on
tblusers.Groupid = tblworkgroups.id
WHERE
1=1
AND
[tblWorkgroups].[Name]='Sigtuna'
AND (
([PlanStartDate]>='2008-09-03' AND [PlanStartDate]<'2008-09-04')
OR
([PlanStopDate]>'2008-09-03' AND [PlanStopDate]<'2008-09-04')
OR
([PlanStartDate]<='2008-09-03' AND [PlanStopDate]>='2008-09-04')
OR
([tblTask].[Id] IN
( SELECT [TaskId] FROM [tblTime] WHERE [StopDate]>'2008-09-03' AND [StopDate]<='2008-09-04')
)
)
Denna tar ca 10 sekunder att köra, men om jag tar bort det sista villkoret enligt neadstående kd, tar den mindre än en sekund...
Någon som har en aning?
SELECT TOP 250
[tblTask].*
FROM
(tblTask inner join tblusers
on
tbltask.[user] = tblusers.[name])
inner join tblworkgroups
on
tblusers.Groupid = tblworkgroups.id
WHERE
1=1
AND
[tblWorkgroups].[Name]='Sigtuna'
AND (
([PlanStartDate]>='2008-09-03' AND [PlanStartDate]<'2008-09-04')
OR
([PlanStopDate]>'2008-09-03' AND [PlanStopDate]<'2008-09-04')
OR
([PlanStartDate]<='2008-09-03' AND [PlanStopDate]>='2008-09-04')
)
Mvh
Henrik
spangoMedlem sedan juni 20008 205 inlägg Ja, använder du subqueries måste du köra en fråga/rad från den omslutande frågan. Många frågor blir det. Joins brukar bli snabbare.
devotionMedlem sedan jan. 20013 582 inlägg Kan man göra om frågan då, så att man slipper subqueries? :)
spangoMedlem sedan juni 20008 205 inlägg Tja, joina in tblTime istället. Det borde la inte vara svårare än de övriga joinsen?
Peter SMedlem sedan dec. 20025 483 inlägg Testa
SELECT TOP 250
[tblTask].*
FROM
((tblTask inner join tblusers
on
tbltask.[user] = tblusers.[name])
inner join tblworkgroups
on
tblusers.Groupid = tblworkgroups.id)
left join tblTime
on
tbltask.id = tbltime.taskid
WHERE
1=1
AND
[tblWorkgroups].[Name]='Sigtuna'
AND (
([PlanStartDate]>='2008-09-03' AND [PlanStartDate]<'2008-09-04')
OR
([PlanStopDate]>'2008-09-03' AND [PlanStopDate]<'2008-09-04')
OR
([PlanStartDate]<='2008-09-03' AND [PlanStopDate]>='2008-09-04')
OR
(tbltime.taskid is not null and tbltime.[StopDate]>'2008-09-03' AND tbltime.[StopDate]<='2008-09-04')
)
devotionMedlem sedan jan. 20013 582 inlägg Nästan... :(
När det finns två tider (tblTime) på ett uppdrag, så visas två poster... Jag vill ju bara att det ska visas en post, även att det finns två tidposter som är kopplade....
Peter SMedlem sedan dec. 20025 483 inlägg Hur ser resultatraderna ut för posterna?
Peter SMedlem sedan dec. 20025 483 inlägg Vad bra :)
SELECT DISTINCT TOP 250...
Peter SMedlem sedan dec. 20025 483 inlägg Byt datatypen till varchar(max).
Peter SMedlem sedan dec. 20025 483 inlägg Då blir det jobbigt :)
Ett hett tips till framtiden är att välja varchar(max) i stället för text och nvarchar(max) i stället för ntext. Då kan coola saker som DISTINCT, GROUP BY och strängfunktioner användas.
spangoMedlem sedan juni 20008 205 inlägg Borde gå att kirra med en COUNT också. Skjuter från höften på halt vatten här men typ:
SELECT TOP 250
[tblTask].*
FROM
((tblTask inner join tblusers
on
tbltask.[user] = tblusers.[name])
inner join tblworkgroups
on
tblusers.Groupid = tblworkgroups.id)
left join tblTime
on
tbltask.id = tbltime.taskid
WHERE
[tblWorkgroups].[Name]='Sigtuna'
AND (
([PlanStartDate]>='2008-09-03' AND [PlanStartDate]<'2008-09-04')
OR
([PlanStopDate]>'2008-09-03' AND [PlanStopDate]<'2008-09-04')
OR
([PlanStartDate]<='2008-09-03' AND [PlanStopDate]>='2008-09-04')
OR
(tbltime.taskid is not null and tbltime.[StopDate]>'2008-09-03' AND tbltime.[StopDate]<='2008-09-04')
HAVING COUNT(tbltime.*) > 0
GROUP BY tbltask.*
devotionMedlem sedan jan. 20013 582 inlägg
spango skrev:
Borde gå att kirra med en COUNT också. Skjuter från höften på halt vatten här men typ:
SELECT TOP 250
[tblTask].*
FROM
((tblTask inner join tblusers
on
tbltask.[user] = tblusers.[name])
inner join tblworkgroups
on
tblusers.Groupid = tblworkgroups.id)
left join tblTime
on
tbltask.id = tbltime.taskid
WHERE
[tblWorkgroups].[Name]='Sigtuna'
AND (
([PlanStartDate]>='2008-09-03' AND [PlanStartDate]<'2008-09-04')
OR
([PlanStopDate]>'2008-09-03' AND [PlanStopDate]<'2008-09-04')
OR
([PlanStartDate]<='2008-09-03' AND [PlanStopDate]>='2008-09-04')
OR
(tbltime.taskid is not null and tbltime.[StopDate]>'2008-09-03' AND tbltime.[StopDate]<='2008-09-04')
HAVING COUNT(tbltime.*) > 0
GROUP BY tbltask.*
Nä, det funkar inte...
Hur många tecken rymmer en Varchar(max) och hur mycket rymmer text? Vad är skillnaden i prestanda, att använda varchar(max) istället för text?
Mvh
Henrik
Peter SMedlem sedan dec. 20025 483 inlägg Text och ntext är på väg att fasas ut till förmån för varchar-motsvarigheterna. Det borde räcka ;)
devotionMedlem sedan jan. 20013 582 inlägg Ja, jag sökte lite och hittade den informationen...
Tex:
http://www.teratrax.com/articles/varchar_max.html
Mvh
Henrik