2014-07-23 47 views
2

对于我正在尝试为Oracle SQL数据库编写的查询,我只是试图从CI表中获取属于某人/某些未列在sys_user中的行的所有行表还没有人工检查下面的查询返回的结果实际上在sys_user表中找到。陌生人stil,owner_id的所有返回值都是相同的。SQL!= ALL()难度

SELECT 
    ci.sys_id as product_id, 
    ci.name as product, 
    ci.sys_class_name as class_name, 
    ci.owned_by as owner_id 
FROM 
    EDQ_EDW.CMDB_CI CI, 
    EDQ_EDW.CMDB_SYS_USER usr 
WHERE 
    ci.owned_by is not null 
    and ci.owned_by != all(usr.sys_id) 

我已经仔细检查了Oracle文档,以确保我没有正确使用!= ALL(),我不相信我。这是什么造成的?

+0

select * from EDQ_EDW.CMDB_SYS_USER where sys_id is null;' – Sebas

+0

此外,我从来没有真正使用过这个'all'比较器,但它似乎根据文档,它应该跟着一个列表或子查询... – Sebas

+0

您可以发布您用于创建并插入EDQ_EDW.CMDB_CI行的查询吗? – cdummy

回答

1

ALL,SOMEANY条件工作的行集,而不是像您在查询中的标量值。尝试这样的事情:

SELECT 
    ci.sys_id as product_id, 
    ci.name as product, 
    ci.sys_class_name as class_name, 
    ci.owned_by as owner_id 
FROM EDQ_EDW.CMDB_CI CI 
WHERE ci.owned_by is not null 
    AND ci.owned_by != ALL (SELECT sys_id FROM EDQ_EDW.CMDB_SYS_USER) 

我不确定逻辑是否正确,虽然语法应该没问题。如果你没有得到你想要的结果,尝试NOT IN来代替:

SELECT 
    ci.sys_id as product_id, 
    ci.name as product, 
    ci.sys_class_name as class_name, 
    ci.owned_by as owner_id 
FROM EDQ_EDW.CMDB_CI CI 
WHERE ci.owned_by is not null 
    AND ci.owned_by NOT IN (SELECT sys_id FROM EDQ_EDW.CMDB_SYS_USER) 

您还可以使用NOT EXISTS或“左联接和检查NULL”查询。这些在某些情况下更快。你可以使用漂亮,简单的例子here找到解释。