SQL - 选择带有额外(唯一)where语句的语句

时间:2017-05-08 23:30:00

标签: sql oracle

我正在尝试选择与其对应的代码id的{​​{1}},但我只希望那些I id是唯一对应的值。正确的Iid53具有其他8值以及code)。使用Oracle SQL。

I

3 个答案:

答案 0 :(得分:3)

您可以通过聚合执行此操作:

select id
from t
group by id
having min(code) = 'I' and max(code) = 'I';

如果code可以是NULL,则需要考虑其他条件。

答案 1 :(得分:0)

此解决方案的工作原理是将表左键连接到自身上的ID,但代码不同,并查找连接失败的记录。 这将适用于大多数SQL,它可能需要一些调整你的味道

SELECT DISTINCT T0.* FROM [Table] AS T0
LEFT JOIN [Table] AS T1 ON T0.ID = T1.ID AND T0.Code <> T1.Code
WHERE T1.ID IS NULL AND T0.ID = 'I'

答案 2 :(得分:0)

@GordonLinoff方法极有可能是最快的,但根据您的数据,有些替代方案具有不同的性能配置文件。

第一个选项假定:
- 存在具有所有唯一id值的另一个表
- 您的表格上有(id, code)

的索引
SELECT
   primary.id
FROM
   primary  -- the table with a unique list of your IDs
WHERE
   'I' = ALL (SELECT code FROM yourtable WHERE yourtable.id = primary.id)

第二个选项假设您的表有两个索引:
- (code, id) (用于查找具有'I'代码的ID)
- (id, code) (用于查找这些ID是否包含任何其他代码)

(与@ZacFaragher答案基本相似。)

SELECT
   code_i.id
FROM
   your_table    code_i
WHERE
   code_i.code = 'I'
   AND NOT EXISTS (SELECT *
                     FROM yourtable
                    WHERE yourtable.id    = code_i.id
                      AND yourtable.code <> 'I'
                  )

通常值得尝试不同的变体,因为不同的SQL引擎可以更好/更差地处理相关子查询等。