Получение строки на основе определенного условия в sql self-join

Для следующей таблицы возможно ли получить результат с помощью самосоединения?

Стол:

id pId  type
-------------
1  1000  1
2  1001  1  
3  1002  1
4  1000  3

Ожидаемый результат:

id pId  type
-------------
2  1001  1
3  1002  1

Другими словами, мне нужны все строки, имеющие тип 1, но не имеющие типа 3.

Заранее спасибо.


ОБНОВЛЕНИЕ

это вопрос в контексте тестирования производительности. другими словами, есть много строк, таких как 1000 и 1001, 1002.

я пытаюсь улучшить производительность, используя текущую структуру таблицы. но я понимаю, что, вероятно, таблица тоже не очень хорошо спроектирована.


person XoXo    schedule 04.03.2014    source источник
comment
Почему это не может быть простой WHERE Type=1 фильтр? Кроме того, при чем здесь фактор самообъединения?   -  person Will P.    schedule 05.03.2014
comment
@УиллП. потому что 1000 также может быть типом 3   -  person Steve    schedule 05.03.2014
comment
Если это именно те данные, которые вам нужны, почему вы не включаете 1 1000 1 в ожидаемый результат?   -  person Mark C.    schedule 05.03.2014
comment
@MarkLaREZZA выглядит так, будто он неправильно структурирует свою таблицу, но pId 1000 также может быть типа 3.   -  person Steve    schedule 05.03.2014
comment
@ Стив, ты читаешь мои мысли. не могли бы вы объяснить, как не структурировать правую часть таблицы? Спасибо   -  person XoXo    schedule 06.03.2014
comment
@ user3380951 IMO структура таблицы должна быть похожа на таблицу 1: id pID || таблица 2: тип pID или только одна таблица: тип pID, если pID уникален. Это при условии, что тип не имеет ничего общего с id   -  person Steve    schedule 06.03.2014


Ответы (2)


Если вы хотите использовать самосоединение, вы можете использовать этот запрос:

SELECT t1.id, t1.pId, t1.type
FROM
  tablename t1 LEFT JOIN tablename t2
  ON t1.pid = t2.pid AND t2.type=3
WHERE
  t1.type=1 AND
  t2.type IS NULL

См. скрипку здесь.

person fthiella    schedule 04.03.2014
comment
принял этот ответ, так как он использует самосоединение, как это было запрошено в вопросе. - person XoXo; 06.03.2014

Вам не нужны никакие объединения - просто подзапрос - что-то вроде этого:

select * from mytable t1
where not exists (select id from mytable t2 where t1.pid=t2.pid and type=3)
person Aleks G    schedule 04.03.2014