2011-05-09 66 views
3

我目前在存儲過程中有下面的代碼(見下文)。爲了總共返回10個結果,我選出了每個聯盟的前五名。不過,我想參加聯盟的前10名,而不是每個人的5名。有任何想法嗎?這可能嗎?如何在SQL中獲得UNION的前10名結果?

BEGIN 
SELECT TOP 5 
    a_object_ID as [id], 
    a_object_name as [name], 
    'A_object' as [Type] 
FROM [database].[dbo].[table_a] 
WHERE a_object_name LIKE @Search + '%' 

UNION ALL 

SELECT TOP 5 
    b_object_ID as [id], 
    b_object_name as [name], 
    'B_object' as [Type] 
FROM [database].[dbo].[table_b] 
WHERE b_object_name LIKE @Search + '%' 

ORDER BY [name] 
END 
+0

爲什麼這有linq-to-sql標記如果你想在SQL中做到這一點? – BrokenGlass 2011-05-09 20:28:51

+0

對不起@BrokenGlass,我刪除了標籤。 – WEFX 2011-05-09 20:29:57

回答

1

這個怎麼樣?

SELECT TOP 10 * 
FROM 
(
SELECT a_object_ID as [id], 
    a_object_name as [name], 
    'A_object' as [Type] 
FROM [database].[dbo].[table_a] 
WHERE a_object_name LIKE @Search + '%' 
UNION ALL 
SELECT b_object_ID as [id], 
    b_object_name as [name], 
    'B_object' as [Type] 
FROM [database].[dbo].[table_b] 
WHERE b_object_name LIKE @Search + '%' 
) x 
ORDER BY [name] 
2

是的,非常有可能。你只需要從聯合結果中選擇前10名。

SELECT TOP 10 * FROM (
    SELECT 
     a_object_ID as [id], 
     a_object_name as [name], 
     'A_object' as [Type] 
    FROM [database].[dbo].[table_a] 
    WHERE a_object_name LIKE @Search + '%' 

    UNION ALL 

    SELECT 
     b_object_ID as [id], 
     b_object_name as [name], 
     'B_object' as [Type] 
    FROM [database].[dbo].[table_b] 
    WHERE b_object_name LIKE @Search + '%' 
) u 
ORDER BY u.[name] 
+0

謝謝@dotjoe,我默認了@AdaTheDev,因爲他的回答是在你的之前。 – WEFX 2011-05-09 20:48:33

2

讓你UNION子查詢

SELECT TOP 10 * 
FROM (
    SELECT 
     a_object_ID as [id], 
     a_object_name as [name], 
     'A_object' as [Type] 
    FROM [database].[dbo].[table_a] 
    WHERE a_object_name LIKE @Search + '%' 

    UNION ALL 

    SELECT 
     b_object_ID as [id], 
     b_object_name as [name], 
     'B_object' as [Type] 
    FROM [database].[dbo].[table_b] 
    WHERE b_object_name LIKE @Search + '%' 
) AS subquery 
ORDER BY subquery.[name] 
1

爲什麼查詢複雜化?這將做的工作:

set rowcount 10 

    SELECT a_object_ID as [id], 
     a_object_name as [name], 
     'A_object' as [Type] 
    FROM [database].[dbo].[table_a] 
    WHERE a_object_name LIKE @Search + '%' 
UNION ALL 
    SELECT b_object_ID as [id], 
     b_object_name as [name], 
     'B_object' as [Type] 
    FROM [database].[dbo].[table_b] 
    WHERE b_object_name LIKE @Search + '%' 
ORDER BY [name] 

set rowcount 0 
0

以上答案都是浪費的子查詢收集,然後拒絕潛在的大量的行。你可以改善使用子查詢的問題。

declare @Recs int = 10; 

with cte1 as (
SELECT TOP (@Recs) 
    a_object_ID as [id], 
    a_object_name as [name], 
    'A_object' as [Type] 
FROM [database].[dbo].[table_a] 
WHERE a_object_name LIKE @Search + '%' 
) 
, cte2 as 
(
SELECT TOP (@Recs) 
    a_object_ID as [id], 
    a_object_name as [name], 
    'B_object' as [Type] 
FROM [database].[dbo].[table_a] 
WHERE a_object_name LIKE @Search + '%' 
) 
SELECT TOP (@Recs) [id], [name], [Type] 
(
select [id], [name], [Type] from cte1 
union all 
select [id], [name], [Type] from cte2 
) SQ 
ORDER BY [Name]