如何从sql表中获取特定结果

时间:2017-08-10 14:58:40

标签: sql

从以下数据脚本中我想得到的结果只是最后一个组合('1111111113','viber')。我想搜索临时表并尝试查找仅用于一种类型的数字(仅我的例子是'viber')。

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 DISTINCT
       *
FROM #temp
WHERE [type] = 'viber'
      AND number NOT IN
(
    SELECT number
    FROM #temp
    WHERE [type] <> 'viber'
);

但是我试图找到是否有其他方式可能比这更有效。我的桌子上会有数百万的数据,所以我需要确保我的搜索结果足够快。

提前致谢。

PS。这是我第一次在阅读多年后在stackoverflow上发布一些内容所以请原谅我如果我做错了方法。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

答案 2 :(得分: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