2014-07-23 2 views
2

Для запроса, который я пытаюсь написать для базы данных Oracle SQL, я просто пытаюсь получить все строки из таблицы CI, которые принадлежат кому-то/что-то, что не указано в sys_user table, результаты, возвращаемые запросом ниже при ручной проверке, фактически находятся в таблице sys_user. Stranger 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, где sys_id имеет значение null;' – Sebas

+0

Кроме того, я никогда не использую этот компаратор 'all', но, похоже, в соответствии с документом ему следует следовать список или подзапрос ... – Sebas

+0

Можете ли вы опубликовать запрос, который вы использовали для создания и вставки строк EDQ_EDW.CMDB_CI? – cdummy

ответ

1

Работы ALL, SOME и ANY работают из набора строк, а не из скалярного значения, как у вас в вашем запросе. Попробуйте что-то вроде этого:

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.