2016-06-09 62 views
0

我有以下查詢的SQL Server 2014聯盟CROSS APPLY

SELECT DISTINCT 
    d.UserName, 
    i.itemID, 
    d.Score, 
    d.StoreCode, 
    d.Location 
FROM 
    G.dbo.Users d 
LEFT JOIN 
    G.dbo.Emails s on d.UserName=s.UserName 
CROSS APPLY 
    (
     SELECT TOP (1) 
      ii.ItemID 
     FROM 
      G.dbo.Dump ii 
     WHERE 
      ii.Username=d.UserName 
     AND 
      ii.endTime>DATEADD(hh,3,getDate()) 
    ) i 
WHERE 
    s.serName is null 
AND 
    d.Score>@_Score 
AND 
    (d.processed=0) 
GROUP BY 
    d.UserName, 
    i.itemID, 
    d.Score, 
    d.StoreCode, 
    d.Location 
ORDER BY 
    d.UserName ASC 

現在我需要修改它,因爲表G.dbo.Dump已經分裂成20個較小的表,現在我有Dump_00Dump_19
我試着以這種方式

CROSS APPLY 
(
    SELECT TOP (1) 
     ii.ItemID 
    FROM 
     (
      SELECT TOP (1) FROM G.dbo.Dump_00 
      UNION 
      SELECT TOP (1) FROM G.dbo.Dump_01 
      UNION 
      ..... 
      SELECT TOP (1) FROM G.dbo.Dump_19 
     ) ii 
    WHERE 
     ii.UserName=d.UserName 
    AND 
     ii.EndTime>DATEADD(hh,3,getDate()) 
) i 

但結果修改使用UNIONCROSS APPLY節的一部分,工作不正常

可以建議如果UNION是正確的方式,以及如何申請,或另一種解決方案?

謝謝!

+0

它應該返回什麼?沒有'ORDER BY'的'TOP 1'不保證任何特定的行。 –

+0

因此,我們也需要成爲讀者的頭腦,要知道「不按預期工作」實際上是什麼意思? –

+0

@MartinSmith它應該返回用戶名和第一個(仍然有效)用戶出現在賣家表中,但不在電子郵件表中。 關於TOP 1,是的,你說得對,但它已經足夠了,它返回一個隨機結果時間> DateAdd ...沒有添加Order BY來減少處理時間,因爲轉儲表已超過1億個記錄。 – Joe

回答

2

從聯合元素中刪除TOP 1。不知道爲什麼添加。從邏輯上講,你是在所有表的聯合集之後。

此外,我不認爲你想要一個工會。你想要連接。

CROSS APPLY 
(
    SELECT TOP (1) ii.ItemID 
    FROM 
     (
      SELECT FROM G.dbo.Dump_00 --changed 
      UNION ALL --changed 
      SELECT FROM G.dbo.Dump_01 --changed 
      ..... 
     ) ii 
) i 
+0

嗯..你是什麼意思'你不想要一個工會,你想要連接嗎?'考慮到刪除頂部1似乎工作..我怎樣才能實現連接而不是聯合? – Joe

+0

如果你將所有的行分開,那麼不是所有行都加上一個獨特的操作。聯盟確實是一個明顯的區別。 – usr

+0

好吧,而聯盟所有不.. ..謝謝..它的工作原理! – Joe