PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как работи EXCEPT в PostgreSQL

В PostgreSQL, EXCEPT операторът връща редове, които са върнати от лявата входна заявка, които не са върнати от дясната входна заявка. Това може също да се нарече разликата между две заявки.

Синтаксис

Синтаксисът е така:

query1 EXCEPT [ALL] query2 

Дубликатите се елиминират, освен ако EXCEPT ALL се използва.

Пример

Да предположим, че имаме следните таблици:

SELECT * FROM Teachers;
SELECT * FROM Students; 

Резултат:

<пред> учителски | име на учител -----------+------------ 1 | Уорън 2 | Бен 3 | Кати 4 | Кати 5 | Законопроект 6 | Бил студент | име на студент -----------+------------ 1 | Фей 2 | Jet 3 | Спайк 4 | Ein 5 | Уорън 6 | Бил

Можем да използваме EXCEPT оператор, за да върне учители, които също не са студенти:

SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students; 

Резултат:

 име на учителя ------------- Кати Бен

Така че получаваме само стойности, които се появяват в Teachers таблица, която също не се показва в Students маса.

По подразбиране EXCEPT операторът връща отделни редове. Така че в нашия пример се връща само един ред за Cathy , въпреки че има двама учители с това име.

Горният пример е еквивалент на следната заявка:

SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students; 

Резултат:

 име на учителя ------------- Кати Бен

Това е същият резултат, който получихме, когато нямаше изричен DISTINCT ключова дума. Можем да включим дубликати с ALL ключова дума (повече за това по-късно).

Можем да получим различни резултати, в зависимост от това коя маса е отляво и коя отдясно. Ето пример, който поставя Students таблица вляво и Teachers вдясно:

SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers; 

Резултат:

 име на студент ------------- Faye Jet Spike Ein

Този път получаваме ученици, които не са и учители.

Включване на дубликати

По подразбиране EXCEPT оператор имплицитно прилага DISTINCT операция. С други думи, той връща само различни стойности по подразбиране.

Можем да включим ALL ключова дума, за да включим дубликати в нашия резултат:

SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students; 

Резултат:

 име на учителя ------------- Кати Кати Бил Бен

Този път получихме четири реда, вместо двата, които получихме в първия ни пример.

Можем да видим, че и двете Кати бяха върнати вместо само една, както в първия ни пример.

Колкото до Бил? Има два законопроекта в Teachers таблица, но тук се връща само една. Това вероятно е защото има един законопроект в Students таблица, която би изключила един от законопроектите от нашите резултати.

Алтернатива

Възможно е да получите същия резултат, без да използвате EXCEPT оператор. Например, можем да пренапишем първия си пример на това:

SELECT 
    DISTINCT TeacherName
FROM Teachers t 
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName); 

Резултат:

 име на учителя ------------- Кати Бен

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Да дефинирате имената на таблици и колони като аргументи във функцията plpgsql?

  2. Как да създадете потребител с привилегии на суперпотребител в PostgreSQL

  3. Напълно деинсталирате PostgreSQL 9.0.4 от Mac OSX Lion?

  4. Преглед на pgModeler за PostgreSQL

  5. Функции на метода за архивиране на PostgreSQL в AWS S3