2017-08-10 57 views
1

從以下數據腳本中,我只想得到最後一個組合('1111111113','viber')作爲選擇結果。我想搜索臨時表並嘗試查找僅用於一種類型的數字(僅用於我的示例'viber')。如何從sql表中獲取特定結果

CREATE TABLE #temp 
(number NVARCHAR(MAX), 
[type] NVARCHAR(MAX) 
); 
INSERT INTO #temp 
VALUES 
('1111111111', 'tel'), 
('1111111111', 'tel'), 
('1111111111', 'viber'), 
('1111111111', 'viber'), 
('1111111111', 'tel2'), 
('1111111111', 'tel2'), 
('1111111112', 'tel'), 
('1111111112', 'tel'), 
('1111111112', 'tel2'), 
('1111111112', 'tel2'), 
('1111111113', 'viber'), 
('1111111113', 'viber'); 

我首先想到的是下面的select查詢

SELECT DISTINCT 
     * 
FROM #temp 
WHERE [type] = 'viber' 
     AND number NOT IN 
(
    SELECT number 
    FROM #temp 
    WHERE [type] <> 'viber' 
); 

但我試圖尋找是否有可能比這更有效的辦法了。我的桌子上有數百萬的數據,所以我需要確保我的搜索結果足夠快。

在此先感謝。

PS。這是我第一次在閱讀多年後在stackoverflow上發佈的東西,所以請原諒我如果我做了錯誤的方式。

回答

0

第一種選擇:

select distinct t1.number, t1.type 
from #temp t1 
where t1.number not in (select t2.number 
         from #temp t2 
         where t2.type <> t1.type) 

我不知道這是最好的方式,但你可以自己測試一下。

第二個選項(應該會更快):

select distinct t1.number, t1.type 
from #temp t1 
where not exists (select 1 
        from #temp t2 
        where t1.type <> t2.type 
         and t1.number = t2.number) 
0

我認爲您的解決方案是正確的,我寧願組,而不是使用不同的。

SELECT 
number, 
type 
FROM #temp 
WHERE [type] = 'viber' 
     AND number NOT IN 
(
    SELECT number 
    FROM #temp 
    WHERE [type] <> 'viber' 
    group by number 
) 
group by 
number, type 
0

給出適當的索引,這將比我的經驗中其他答案中提供的子選擇更快。

SELECT DISTINCT 
     t1.* 
FROM #temp t1 
LEFT JOIN #temp t2 ON t1.type<>t2.type 
    AND t1.number=t2.number 
WHERE t2.type IS NULL 
相關問題