Может ли выбор из одной пустой временной таблицы в SQL привести к тому, что результаты будут пустыми? - PullRequest
1 голос
/ 15 июля 2010

Вот моя проблема.Я создаю 4 временные таблицы для подсчета определенных типов ящиков и часов сотрудника.Учитывая дату начала и дату окончания, мы хотим знать общее количество блоков каждого типа (1, 2 и 3) и их общее количество часов, отработанных в этот период времени.Все работает отлично, если есть хотя бы один из каждого типа, но если присутствуют только два типа, тогда я получаю пустой результат для всего окончательного оператора SELECT.

Итак, может ли оператор SELECT, который содержит пустой темптаблица в строке FROM заставляет все остальное возвращать пустое значение?

Например, диапазон дат от 6-1-10 до 6-10-10 возвращает 10 блоков типа 1, 12 блоков типа 2, 0 блоков типа 3и 36 часов, но результат отображается пустым.Но если его продлить на один день и включить 15 блоков типа 3, запрос сработает.

SELECT Count(isnull(Box_Num,0)) as Box1, emp_num INTO #Box1
FROM  TEST.dbo.Prod_beta2
WHERE BoxType like '1' and time  > '06/01/10' + ' 12:01 AM'  and time  < '06/10/10' + ' 11:59pm' and emp_num like '10467'
group by emp_num


SELECT Count(isnull(Box_Num,0)) as Box2, emp_num INTO #Box2
FROM TEST.dbo.Prod_beta2
WHERE BoxType like '2' and time > '06/01/10' + ' 12:01 AM' and time < '06/10/10' + ' 11:59pm' and emp_num like '10467'
group by emp_num


SELECT count(isnull(box_num,0)) as Box3, emp_num INTO #Box3
from TEST.dbo.Prod_beta2
WHERE BoxType like '3' and time > '06/01/10' + '  12:01 AM' and time < '06/10/10' + ' 11:59pm' and emp_num like '10467'
group by emp_num


SELECT SUM(HOURS) as TotalHours, empid INTO #Hours
FROM TEST.dbo.Timeclock
where timein > '06/01/10' + ' 12:01 AM' and timein < '06/10/10' + ' 11:59pm' and empid like '10467'
group by empid


SELECT Box1, Box2, Box3, TotalHours
FROM #Box1, #Box2, #Box3, #Hours


DROP TABLE #Box1, #Box2, #Box3, #Hours

Ответы [ 2 ]

2 голосов
/ 15 июля 2010

Да. Вы делаете декартово произведение, что означает, что в результате вы получите строки B1 * B2 * B3 * H.

Когда в B3 нет строк, вы, очевидно, умножаете на ноль.

Первые три из ваших условий могут быть легко объединены (кстати, какой тип данных BoxType и emp_num? Если они числовые, не используйте строки, чтобы избежать ненужных проблем преобразования типов. Дополнительно ваша логика дат, кажется, что-то пропускает с 23:59 до 00:01. Это преднамеренно? Более того, вы, вероятно, должны использовать форматы даты ISO, чтобы избежать каких-либо проблем, если вы когда-либо меняете серверы и т. д.)

SELECT 
Count(CASE WHEN BoxType = '1' THEN 1 ELSE NULL END) as Box1,
 Count(CASE WHEN BoxType = '2' THEN 1 ELSE NULL END) as Box2,
 Count(CASE WHEN BoxType = '3' THEN 1 ELSE NULL END) as Box3
FROM  TEST.dbo.Prod_beta2
WHERE BoxType in ('1','2','3') and time  > '06/01/10' + ' 12:01 AM'  and 
  time  < '06/10/10' + ' 11:59pm' and emp_num like '10467'
group by emp_num
0 голосов
/ 15 июля 2010

Если поля одного типа, вам не следует делать это так:

SELECT Box1, Box2, Box3, TotalHours 
FROM #Box1, #Box2, #Box3, #Hours

Вы должны использовать UNION ALL запрос

Вот так:

   SELECT Count(isnull(Box_Num,0)) as Box1, emp_num
    FROM  TEST.dbo.Prod_beta2 
    WHERE BoxType like '1' and time  > '06/01/10' + ' 12:01 AM'  and time  < '06/10/10' + ' 11:59pm' and emp_num like '10467' 
    UNION ALL
    SELECT Count(isnull(Box_Num,0)) as Box2, emp_num
    FROM TEST.dbo.Prod_beta2 
    WHERE BoxType like '2' and time > '06/01/10' + ' 12:01 AM' and time < '06/10/10' + ' 11:59pm' and emp_num like '10467' 
    UNION ALL

SELECT count(isnull(box_num,0)) as Box3, emp_num
from TEST.dbo.Prod_beta2
WHERE BoxType like '3' and time > '06/01/10' + '  12:01 AM' and time < '06/10/10' + ' 11:59pm' and emp_num like '10467'
group by emp_num

Ваш последний выбор - единственное, что отличается, поэтому просто отделите этот запрос от количества отображаемых блоков.

Однако вам даже не нужны временные таблицы для этого, просто используйте стандартные операторы SELECT и добавьте объединение всех к каждому из них. Ваш текущий оператор выдаст 0 строк при условии, что любой из этих запросов содержит 0 строк. Посмотрите на декартовы произведения и что они означают

...