2013-09-18 3 views
-1

Позвольте мне попытаться объяснить, что я пытаюсь сделать. Во-первых, у меня есть база данных или предметы, которые огромны, 50 тыс. И более, ежедневно растет. Мне нужно извлечь информацию из этой базы данных на основе того, чего у нее нет. (Я использую SQL; Psql или MySql не имеет значения.)выберите из этого, который не содержит информации

Так выглядит база данных, как это (примерно)

SELECT * FROM my_table 
+---------+--------+ 
| ITEM | TYPE | 
+---------+--------+ 
| 12EU | P  | 
| 12EU | R  | 
| 12EU | T  | 
| 34RE | P  | 
| 34RE | R  | 
| 34RE | T  | 
| 54TR | R  | 
| 54TR | T  | 
+---------+--------+

Не все элементы имеют "P", но все они имеют «T» и «R.» Мне нужно вытащить ПУНКТ, у которого нет ТИПА «Р», для меня это не имеет значения.

В этом примере я бы хотел ITEM «54TR», потому что у него нет ТИПА «P.»

Надеюсь, это поможет лучше объяснить то, что я пытаюсь сделать.

Пример того, что я сделал:

SELECT distinct ITEM 
FROM (SELECT distinct ITEM FROM my_table WHERE TYPE='P') q 
WHERE TYPE!='P' 
AND ITEM != q.ITEM 
ORDER BY ITEM 

Это не работает, она по-прежнему возвращает другие типы, не правильный путь ...

+1

Это всегда хорошая идея, чтобы действительно опубликовать желаемый результат, установленный в дополнение к исходным данным. И часто полезно назвать СУБД. –

+0

У 54TR есть P, 34RU и 34RE нет P, это правильно? – Gar

+0

Нет 54TR не имеет P, другие делают. Использование! = 'P' в предложении where возвращает все элементы, у которых нет P, но это много информации. Мне нужны предметы, у которых нет P вообще. – Demas

ответ

2
select distinct item from yourtablename where type!='P' 
minus 
select distinct item from yourtablename where type='P' 

пример:

create table myt (item varchar2(10),atype varchar2(10),piece varchar2(10)); 
insert into myt values ('12EU','P','ext'); 
insert into myt values ('12EU','R','ext'); 
insert into myt values ('34RE','T','ext'); 
insert into myt values ('54RT','P','ext'); 
insert into myt values ('34EU','R','ext'); 
insert into myt values ('54TR','P','ext'); 
commit; 

SQL> select * from myt;

 
ITEM  ATYPE  PIECE 
---------- ---------- ---------- 
12EU  P   ext 
12EU  R   ext 
34RE  T   ext 
54RT  P   ext 
34EU  R   ext 
54TR  P   ext 

6 rows selected. 

SQL> выберите отличный элемент из Мит, где atype = 'P' 2 минус 3 выберите отличный элемент из Мит где atype = 'P';

 
ITEM 
---------- 
34EU 
34RE 
+0

Это выглядит излишним. –

+0

Почему именно вам нужен «MINUS SELECT ...»? Первая строка SELECT уже выполняет задание. – cyroxx

+0

Действительно, используя избыточность, чтобы попытаться оптимизировать бит запроса, избегая явных объединений, размер таблицы составляет 50K. – Gar

0
select * from my_table t 
where type != 'P' 
AND not exists 
     (select 1 from my_table t2 where t2.item = t.item and t2.type = 'P') 
0

Попробуйте Жека следующий SQL запрос

select * from yourtablename where Type not like '%P%' 
+0

@ DanielHilgarth спасибо и исправлено .. :) – Pawan

0
Select * from tablename where type != 'p'