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