Shame the optimizer can't spot the literals are all different. Can't have everything I suppose...You should find that the same plan gets generated irrespective of where you put the WHERE conditions. This sort of thing is usually a possibility -- and less irritating to generate:SELECT [Date], [Name], Hour, PriceFROM ( SELECT [Date], [Name], 1 as Hour, [100] AS Price FROM [TABLE] UNION ALL SELECT [Date], [Name], 2 as Hour, [200] AS Price FROM [TABLE] UNION ALL SELECT [Date], [Name], 3 as Hour, [300] AS Price FROM [TABLE] etc... ) AS AWHERE Date = '20000701' and Name = 'Test'
A radically different way to do it is like this:SELECT [Date], [Name], h AS Hour, CASE h WHEN 1 THEN [100] WHEN 2 THEN [200] WHEN 3 THEN [300] WHEN 4 THEN [400] WHEN 5 THEN [500] WHEN 6 THEN [600] WHEN 7 THEN [700] WHEN 8 THEN [800] WHEN 9 THEN [900] WHEN 10 THEN [1000] WHEN 11 THEN [1100] WHEN 12 THEN [1200] WHEN 13 THEN [1300] WHEN 14 THEN [1400] WHEN 15 THEN [1500] WHEN 16 THEN [1600] WHEN 17 THEN [1700] WHEN 18 THEN [1800] WHEN 19 THEN [1900] WHEN 20 THEN [2000] WHEN 21 THEN [2100] WHEN 22 THEN [2200] WHEN 23 THEN [2300] WHEN 24 THEN [2400] END AS PriceFROM [TABLE]CROSS JOIN ( SELECT 1 AS h UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 UNION SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 UNION SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL SELECT 20 UNION SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 UNION ALL SELECT 24 ) AS HoursWHERE Date = '20000701' and Name = 'Test'
Which means there should be one scan / seek of [TABLE] instead of 24 -- not that this means it will necessarily run faster!Edited by - Arnold Fribble on 08/14/2002 13:17:12Edited by - Arnold Fribble on 08/14/2002 13:27:27