假设我有一张有结构的表格
(
id int,
value int,
key int
)
我只想留下那些与
id
相对应的行,其中至少有一次具有某些 key
。例如,如果需要 key
等于 5
,则从表
id value key
1 1 1
1 1 2
2 1 5
2 3 2
3 5 4
3 5 5
我想要得到结果
id value key
2 1 5
2 3 2
3 5 4
3 5 5
因为
id
1 的对象在 key
列中没有 5,而其他对象则有。
我知道有两种方法可以做到这一点,在这两种方法中,我们都创建一个带有所需 id 的 tmp_table
,例如
select [distinct] id from example_table where key=5
然后进行过滤:
select * from example_table where id in tmp_table
或加入:
select e.* from example_table e join tmp_table t on e.id = t.id
对于这些场景我有几个问题:
distinct
,否则数据将重复。我必须采用第一种方法吗?从一方面来说 distinct
是昂贵的操作,从另一方面来说 in
应该更快(如果没有某种哈希表)IN
和 JOIN
方法都可能执行类似的操作。DISTINCT
。EXISTS
来避免 DISTINCT
。 SELECT e.* FROM example_table e
WHERE EXISTS (
SELECT 1 FROM example_table WHERE id = e.id AND key = 5
);
您还可以使用Vertica的
EXPLAIN
命令来检查不同方法的执行情况。
另外两种方式:
id
为 5 的所有 value
行:WITH
id_s AS (
SELECT
id
FROM indata
WHERE key = 5
)
SELECT
i.*
FROM indata i
INNER JOIN id_s USING(id)
;
WHERE IN(<fullselect>)
谓词:
SELECT
*
FROM indata
WHERE id IN (
SELECT id FROM indata
WHERE key=5
);