Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
simmer
Starting Member
5 Posts |
Posted - 2011-05-29 : 16:00:10
|
| I have two queries which both work on their own but need to combine them into one. One query returns a paged set of results (ie 10/25/50 at a time, reducing traffic). The other does lookups on another table to get the first/last of related data. Each query on its own is chunky enough and I can't get my novice head around combining the two!Query 1:ALTER PROCEDURE dbo.StoredProcedure1 ( @Headcode nvarchar(4) = NULL )AS /* SET NOCOUNT ON */ WITH MySchedule AS (SELECT ScheduleID, MIN(Ordering) AS Origin, MAX(Ordering) AS Destination FROM ScheduleLocation GROUP BY ScheduleID), MyResults AS (SELECT S.ScheduleID, O.LocationID AS OriginLocationID, O.DepartureTime AS departureTime, D.LocationID AS DestinationLocationID, D.ArrivalTime AS ArrivalTime FROM MySchedule AS S INNER JOIN ScheduleLocation AS O ON S.ScheduleID = O.ScheduleID AND S.Origin = O.Ordering INNER JOIN ScheduleLocation AS D ON S.ScheduleID = D.ScheduleID AND S.Destination = D.Ordering) SELECT R.ScheduleID, O.LocationCode AS Origin, R.departureTime AS Depart, D.LocationCode AS Destination, R.ArrivalTime AS Arrive, Schedule.Headcode, Schedule.DateFrom, Schedule.DateTo, Schedule.RunDays FROM MyResults AS R INNER JOIN Location AS D ON R.DestinationLocationID = D.LocationID INNER JOIN Location AS O ON R.OriginLocationID = O.LocationID INNER JOIN Schedule ON R.ScheduleID = Schedule.ScheduleID) RETURNQuery 2:SELECT ScheduleID, Headcode, RunDays, DateFrom, '12:34' AS Depart, DateTo, '23:59' AS Arrive, 'A' AS Origin, 'B' AS DestinationFROM (SELECT ScheduleID, Headcode, DateFrom, DateTo, RunDays, ROW_NUMBER() OVER(ORDER BY Headcode ASC, DateFrom ASC) AS RecordRank FROM Schedule WHERE 1=1(additional filters inserted here eg WHERE 1=1 AND Headcode LIKE '1A01'))AS ProductsWithRowNumberWHERE RecordRank > @startRowIndexAND RecordRank <= @startRowIndex + @maximumRows)As you can see from the second query, I've temporarily put some dummy values in the SELECT (ie Depart, Arrive, Origin, Destination) which would be replaced by the final SELECT in the first query (O.LocationCode AS Origin etc).I don't think you need to know the table detail but if you do, let me know. This little hobby is proving expensive time-wise!Many thanks. |
|
|
lappin
Posting Yak Master
182 Posts |
Posted - 2011-06-01 : 11:16:51
|
| If you take existing code but create a function instead of procedure you should be able to join the results of each.e.g.CREATE Function dbo.fn1(@Headcode nvarchar(4) = NULL)AS/* SET NOCOUNT ON */WITH MySchedule AS (SELECT ScheduleID, MIN(Ordering) AS Origin, MAX(Ordering) AS DestinationFROM ScheduleLocationGROUP BY ScheduleID), MyResults AS(SELECT S.ScheduleID, O.LocationID AS OriginLocationID, O.DepartureTime AS departureTime, D.LocationID AS DestinationLocationID, D.ArrivalTime AS ArrivalTimeFROM MySchedule AS S INNER JOINScheduleLocation AS O ON S.ScheduleID = O.ScheduleID AND S.Origin = O.Ordering INNER JOINScheduleLocation AS D ON S.ScheduleID = D.ScheduleID AND S.Destination = D.Ordering)SELECT R.ScheduleID, O.LocationCode AS Origin, R.departureTime AS Depart, D.LocationCode AS Destination, R.ArrivalTime AS Arrive, Schedule.Headcode, Schedule.DateFrom, Schedule.DateTo, Schedule.RunDaysFROM MyResults AS R INNER JOINLocation AS D ON R.DestinationLocationID = D.LocationID INNER JOINLocation AS O ON R.OriginLocationID = O.LocationID INNER JOINSchedule ON R.ScheduleID = Schedule.ScheduleID)RETURNQuery 2:CREATE Function dbo.fn2 -- OR create a VIEWAS SELECT ScheduleID, Headcode, RunDays, DateFrom, '12:34' AS Depart, DateTo, '23:59' AS Arrive, 'A' AS Origin, 'B' AS DestinationFROM (SELECT ScheduleID, Headcode, DateFrom, DateTo, RunDays, ROW_NUMBER()OVER(ORDER BY Headcode ASC, DateFrom ASC)AS RecordRank FROM Schedule WHERE 1=1(additional filters inserted here eg WHERE 1=1 AND Headcode LIKE '1A01'))AS ProductsWithRowNumberWHERE RecordRank > @startRowIndexAND RecordRank <= @startRowIndex + @maximumRows)Select * from fn1(hc)join fn2 on fn1.ScheduleID = fn2.ScheduleID etc |
 |
|
|
|
|
|
|
|