2016-06-09 3 views
0

У меня есть следующий запросSQL Server 2014 UNION в 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 

Теперь мне нужно изменить его, так как таблица G.dbo.Dump была разделена на 20 небольших таблиц, и теперь я Dump_00 к Dump_19
Стараюсь изменить часть секции CROSS APPLY используя UNION таким образом

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 

, но результат не работает, как ожидалось

может предложить, если UNION является правильным способом и в случае применения или другого решения?

Спасибо!

+0

Что должно было возвращаться? 'TOP 1'' без' ORDER BY' не гарантирует никакой конкретной строки. –

+0

Значит, нам нужно быть внимательными читателями, чтобы знать, что «не работает должным образом» на самом деле означает? –

+0

@MartinSmith Предполагается вернуть имя пользователя и первый (все еще активный) элемент пользователей, присутствующих в таблице продавцов, но не в таблице электронной почты. Что касается TOP 1, да, вы правы, но достаточно, чтобы он возвращал случайный элемент с конечным временем> DateAdd ... не добавил Order BY, чтобы сократить время обработки, так как Dump Table составляла более 100 миллионов записей. – 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

OK пока UNION ALL не делает .. Спасибо .. это работает! – Joe

Смежные вопросы