Использование count в качестве условия в Oracle - PullRequest
5 голосов
/ 27 января 2012

У меня есть два запроса, q1 и q2.Я хочу вернуть столбцы из q1, когда q2 не имеет строк.Пример:

select a, b, c from t1 where
count(select d, e, f from t2 where ...) == 0
and ...

Обычно я просто использовал бы JOIN, но в этом случае у меня нет связанных ключей.

Как лучше всего это сделать в Oracle?

Ответы [ 6 ]

1 голос
/ 24 апреля 2012

возможно, вы можете попробовать что-то вроде этого

<code>
SELECT *
  FROM TABLE1
 WHERE DECODE((SELECT COUNT(T2.SOME_COLUMN)
                FROM TABLE2 T2
               WHERE T2.CONDITION_COLUMN = 'SOM_VAL'),
              0,
              'FALSE',
              'TRUE') = 'TRUE'

Здесь вложенный запрос в

<code>DECODE
будет подсчитывать номер определенного столбца.Если это ZERO, он вернет false и запрос ничего не даст, или если он вернет что-то большее, чем ZERO, он вернет TRUE и запрос вернет значения.

Надеюсь, это поможет

1 голос
/ 27 января 2012
select <columns> 
  from table 
 where not exists (select <columns> 
                     from table2 
                     where ....) 

должно работать. Если бы между внутренним запросом и внешним запросом была некоторая связь, вы просто добавили бы дополнительный предикат к подзапросу NOT EXISTS, который выражал бы эту связь (т.е. table.column_name = table2.column_name). Но нет необходимости делать корреляцию подзапроса.

Вам также не нужно указывать имена столбцов в списке SELECT подзапроса. Это будет иметь значение только в том случае, если добавление столбцов изменит план запроса (скажем, заставляя оптимизатор запрашивать таблицу, а не использовать индекс покрытия). Вы получите тот же результат, если будете использовать что-то подобное, и это может быть немного быстрее.

select <columns> 
  from table 
 where not exists (select 1 
                     from table2 
                     where ....) 
1 голос
/ 27 января 2012

Я предполагаю, что эти запросы совершенно независимы, например:

create table table_q1 (
  id  number,
  txt varchar2(10)
);

insert into table_q1 values ( 1, 'This');
insert into table_q1 values ( 2, 'data');
insert into table_q1 values ( 3, 'only');
insert into table_q1 values ( 4, 'selected');
insert into table_q1 values ( 5, 'if');
insert into table_q1 values ( 6, 'other');
insert into table_q1 values ( 7, 'query''s');
insert into table_q1 values ( 8, 'count');
insert into table_q1 values ( 9, 'greater');
insert into table_q1 values (10, 'zero');

create table table_q2 (
  id  number
);

insert into table_q2 values (1);
insert into table_q2 values (2);
insert into table_q2 values (3);
insert into table_q2 values (4);

Теперь у вас может быть запрос with q2, который выбирает счетчик table_q2 и перекрестно соединяет его с table_q1 с условием q2.cnt = 0, так что q1 выбирает записи, только если число q2 равно! = 0.

Следующая инструкция выбора не возвращает записей:

with q2 as (select count(*) cnt from table_q2 where id > 2)
select q1.* from table_q1 q1, q2
where q2.cnt = 0
order by q1.id;

Но этот делает:

with q2 as (select count(*) cnt from table_q2 where id > 1000)
select q1.* from table_q1 q1, q2
where q2.cnt = 0
order by q1.id;
0 голосов
/ 27 февраля 2013

Проверьте этот запрос

Проверено

select * from table1 where (SELECT count() FROM table2)=0
0 голосов
/ 27 января 2012

Если таблицы фактически объединены в каком-то поле (назовем его id для обоих), стоит построить запрос, подобный

SELECT ... FROM table WHERE id NOT IN (SELECT id FROM table2 WHERE ...)
0 голосов
/ 27 января 2012
  1. Напишите запрос, который включает COUNT и GROUP BY, не пытаясь отфильтровать COUNT (x) = 0. Вы должны увидеть нули в наборе результатов. То, что вы хотите устранить.

  2. Добавить предложение HAVING: HAVING COUNT (x) <> 0

...