2011-02-10 63 views
0

我个人觉得我给这两个查询的条件都一样,为什么他们会产生不同的结果。虽然我认为他们应该产生相同的结果。我只是不了解这种异常的性质。请给我解释一下。两个查询之间有什么区别

SELECT 
    MIN(EventID) 
FROM 
    [3rdi_Events] 
WHERE 
    EventID IN (
     SELECT DISTINCT 
      EventId 
     FROM 
      [3rdi_EventDates] 
     WHERE 
      EventDate Between '2/9/2011' AND '3/11/2012' 
      ) 
GROUP BY 
    EventTypeId 

SELECT 
    EventId 
FROM 
    [3rdi_Events] AS E 
WHERE 
    E.EventID IN (
     SELECT 
      min(EventId) 
     FROM 
      [3rdi_Events] 
     GROUP BY 
      EventTypeId 
    ) 
    AND 
    E.EventID IN (
     SELECT DISTINCT 
      EventId 
     FROM 
      [3rdi_EventDates] 
     WHERE 
      EventDate Between'2/9/2011' AND '3/11/2012' 
    ) 

回答

0

考虑一下:

EventId   Date  EventType 
1    1/1/11 1 
2    3/3/11 1 

第一查询包括事件其日期内11年2月9日和12年3月11日,也就是事件没有。 2.

第二个查询只包括具有给定类型(编号1)(第一个子选择)的最小EventId和日期介于2/9/11和3/11/12(第二个子选择)之间的事件。没有行匹配这个组合。

0

在零件中的第二个查询:

WHERE 
E.EventID IN (
    SELECT 
     min(EventId) 
    FROM 
     [3rdi_Events] 
    GROUP BY 
     EventTypeId 
) 

你不必为EVENTDATE条件,让你从表与其他部分寻找最小元素,也:

AND 
E.EventID IN (
    SELECT DISTINCT 
     EventId 
    FROM 
     [3rdi_EventDates] 
    WHERE 
     EventDate Between'2/9/2011' AND '3/11/2012' 
) 

将在该日期范围内。所以如果最小值不在该范围内,它就不会显示它。然而,第一查询从该日期范围

0

在第一个查询您选择最小EventId这就是日期落入'2/9/2011''3/11/2012'

在第二查询您选择EventId其中所述EventID返回最小元素在表中的最少,其中日期的'2/9/2011''3/11/2012'

之间坠入如果在第二个查询如果表中的最低EventId不倒在这些日期内不应退还任何价值。

我想。