2011-06-17 83 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