2016-06-09 19 views
0

GILT Ich habe die folgende AbfrageSQL Server 2014 UNION in CROSS

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 

Jetzt muss ich es ändern, da Tabelle G.dbo.Dump hat in 20 kleinere Tische aufgeteilt worden und jetzt habe ich Dump_00-Dump_19
Ich versuche, Teil des CROSS APPLY Abschnitt ändern UNION auf diese Weise

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 

aber Ergebnis mit funktioniert nicht wie erwartet

kann vorschlagen, ob UNION der richtige Weg ist und im Falle, wie man anwendet, oder eine andere Lösung?

Danke!

+0

was soll es zurückgeben? 'TOP 1'' ohne' ORDER BY' garantiert keine bestimmte Zeile. –

+0

Also müssen wir auch Gedankenleser sein, um zu wissen, was "nicht wie erwartet funktioniert" eigentlich bedeutet? –

+0

@MartinSmith Es soll Username und First (immer noch aktiv) Item von Benutzern in Sellers-Tabelle, aber nicht in E-Mail-Tabelle. In Bezug auf TOP 1, ja, Sie haben recht, aber es ist genug, es gibt ein zufälliges Element mit endtime> DateAdd ... nicht hinzugefügt Order BY, um Verarbeitungszeit seit Dump Tabelle mehr als 100 Millionen Datensätze zu reduzieren. – Joe

Antwort

2

Entfernen Sie die von den Union-Elementen. Nicht sicher, warum das hinzugefügt wurde. Logischerweise sind Sie hinter einer Menge, die die Vereinigung aller Tabellen ist.

Auch glaube ich nicht, dass Sie eine Vereinigung überhaupt wollen. Sie möchten die Verkettung.

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

Hmmm .. was meinst du damit, du willst überhaupt keine Gewerkschaft, willst du die Verkettung? wenn man bedenkt, dass das Entfernen von Top 1 funktioniert. Wie kann ich eine Verkettung anstelle einer Vereinigung erreichen? – Joe

+0

Wenn Sie die Zeilen teilen, möchten Sie wahrscheinlich alle, nicht alle von ihnen plus eine eindeutige Operation. Union macht einen impliziten Unterschied. – usr

+0

OK während UNION ALL nicht .. Danke .. es funktioniert! – Joe