2011-06-17 68 views
0

我有两个不同的数据库SQL查询始终运行 - SQL Server 2008中

Database1 - Table1 
Database2 - Table2 

Table1 Columns: NimID,IDDate,Station 
Table2 Columns: XilID,XilDate 

Table1             Table2 
NimID IDDate   Station     XilID  XilDate  
234  2011-04-21  HYD      234  2011-04-21 
237  2011-04-21  CHN      208  2011-04-21 
208  2011-04-21  HYD      209  2011-04-15 
209  2011-04-15  DEL      218  2011-05-28 
                  212  2011-03-11 

我想了解有多少的ID在表1表2中,其中IDDate = XilDate ='不是两个表2011-04- 21'组由Table1.Station组成。 我做了以下

select x.Station as Station, 
     count(distinct x.NimID) as Difference 
from (
     select a.NimID, 
      a.IDDate, 
      a.Station 
     from database1.dbo.table1 a 
     where left(cast(a.Date as date),11)='2011-04-21' 
) as X, (
     select b.XilID, 
      b.XILDate 
     from database2.dbo.Table2 b 
     where b.XilDate='2011-04-21' 
) as Y 
where x.NimID not in (y.XilID) 
group by x.Station 

查询,但此查询将永远运行下去.. 请记住表是从位于同一台服务器上不同的数据库和表1中包含10,000,000记录和表2包含约1300万条记录 请纠正我的查询,如果错误或建议我更快的方式

感谢

回答

1
DECLARE @date datetime; 
SET @date = '20110421'; 

SELECT 
    Station, 
    Diff = COUNT(*) 
FROM (
    SELECT 
    a.NimID, 
    a.IDDate, 
    a.Station 
    FROM database1.dbo.table1 a 
    LEFT JOIN database2.dbo.table2 b ON a.NimID = b.XilID AND b.XilDate = @date 
    WHERE b.XilID IS NULL 
    AND a.IDDate >= @date 
    AND a.IDDate < DATEADD(day, 1, @date) 
) s 
GROUP BY Station 

UPDATE

实际上,上述溶液可以没有子查询重写。子选择是尝试一些想法的结果,我最终放弃了这个想法,但是子选择仍然存在一些未知的原因。下面是不支持子相同的解决方案:

DECLARE @date datetime; 
SET @date = '20110421'; 

SELECT 
    a.Station, 
    Diff = COUNT(*) 
FROM database1.dbo.table1 a 
    LEFT JOIN database2.dbo.table2 b ON a.NimID = b.XilID AND b.XilDate = @date 
WHERE b.XilID IS NULL 
    AND a.IDDate >= @date 
    AND a.IDDate < DATEADD(day, 1, @date) 
GROUP BY a.Station 
+0

了不起的人......非常感谢.. 。我一直讨厌使用连接..现在连接帮助我成千上万的数据.. :) – ARB 2011-06-17 07:58:24

+0

@ARB:那么对你有好处。看起来非常像你现在会更恨他们。 :)请看我的更新,我试图重写解决方案,使其更简单。 – 2011-06-17 08:22:28

+0

嗯..谢谢。 。:)。今晚会去参加学习。 。 :) – ARB 2011-06-17 09:07:19

0

尝试下面的 - 注意,您似乎在试图加入两个表来执行“不”,这将导致一个非常缓慢的生产和非常错误的sultset。

此外,如果IDDate是DATETIME列,那么您最好是执行范围检查,例如, (a.IDDate >= '2011-04-21' AND a.IDDate < '2011-04-22')。考虑一下 - 如果它是格式为yyyy-MM-dd的文本列,那么范围检查也会起作用 - 如果它是具有混合格式日期的文本列,那么忘记我提到了它。

select x.Station as Station, 
     count(distinct x.NimID) as Difference 
from (
     select a.NimID, 
      a.IDDate, 
      a.Station 
     from database1.dbo.table1 a 
     where left(cast(a.IDDate as date),11)='2011-04-21' 
) as X 
where x.NimID not in (
     select b.XilID 
     from database2.dbo.Table2 b 
     where b.XilDate='2011-04-21' 
) 
group by x.Station 
1

尽量避免从datetime转换为varchar。

WHERE a.Date >= '2011-04-21' 
    AND a.Date < (CAST('2011-04-21' AS datetime) + 1) 
+0

您好,感谢..它减少了一半的时间。但仍然以1秒的每个记录......呵呵 – ARB 2011-06-17 07:31:48