Sql 选择列中具有特定值的记录

Sql 选择列中具有特定值的记录,sql,oracle,Sql,Oracle,我试图在其中一列中选择具有特定值的记录。考虑下面的例子: NAME VALUETEST rec1 val1 rec2 val1 rec3 val1 rec1 test123 rec1 test1234 rec2 test1234 这里我只希望选择那些valuetest列值为val1、test123和test1234的记录,即rec1。我尝试了下面简单的select查询,但它没有给我想要的结果 查询:select*from-temp,其中valuete

我试图在其中一列中选择具有特定值的记录。考虑下面的例子:

NAME    VALUETEST

rec1    val1
rec2    val1
rec3    val1
rec1    test123
rec1    test1234
rec2    test1234
这里我只希望选择那些valuetest列值为val1、test123和test1234的记录,即rec1。我尝试了下面简单的select查询,但它没有给我想要的结果
查询:
select*from-temp,其中valuetest=all('val1','test123','test1234')

此查询是否提供了所需的结果

select *
from temp
where valuetest in ('val1', 'test123', 'test1234');

从中valuetest所在的临时位置选择*('val1'、'test123'、'test1234')

或者用可以用的


选择*from temp,其中valuetest=ANY('val1','test123','test1234')


使用Any代替All,因为对于All,它试图匹配单个记录的所有三个值

我怀疑这就是您想要的:

select name from temp where valuetest = 'val1'
intersect
select name from temp where valuetest = 'test123'
intersect
select name from temp where valuetest = 'test1234'
若要从表中选择的列不止是名称,请运行:

select * from temp where name in(
    select name from temp where valuetest = 'val1'
    intersect
    select name from temp where valuetest = 'test123'
    intersect
    select name from temp where valuetest = 'test1234')
这应该做到:

SELECT name, COUNT(*)
FROM temp
WHERE valuetest IN ('val1','test123','test1234')
GROUP BY name
HAVING COUNT(*) = 3;
它将检索所有与
val1
test123
test1234
匹配的
NAME
s

如果您实际上需要所有行,而不仅仅是名称,则应使用
连接

SELECT *
FROM temp
INNER JOIN (
    SELECT name, COUNT(*)
    FROM temp
    WHERE valuetest IN ('val1','test123','test1234')
    GROUP BY name
    HAVING COUNT(*) = 3
) USING(name);

此外,无论条件中的值有多少(
'val1'、'test123'、'test1234'、…
),这种方法都只会扫描表两次。

您的答案会给出包含任何一个值test的所有记录,然而,我只需要那些具有所有3个valuetest值的记录。您的答案为我提供了所有具有任何一个valuetest值的记录,而我只需要那些具有所有3个valuetest值的记录。但它将从每个名称中删除所有具有所有3个值的其他行,并且可能会引起兴趣。诚然,问题中没有给出多少细节,但这是一个限制。我同意,但考虑到上下文,唯一感兴趣的价值似乎是
NAME
。无论哪种方式,我的查询都可以很容易地调整以适应此请求。谢谢你指出这一点(我更新了我的答案)。谢谢你的答案。你的答案似乎给了我正确的结果,但我想知道我的查询出了什么问题?一个值不能同时是X、Y和Z。但是,单个值可以高于或低于X、Y和Z。通常使用ALL/ANY。查看另一种查看方法:您希望表中的“name”值至少在一行上有一个valuetest值,该值在另一行(不相同的行)上为“X”,“Y”,在另一行(不相同的行)上为“Z”。我已经编辑了您的标题。请参阅“”,其中的共识是“不,他们不应该”。