sql >> Database >  >> RDS >> Oracle

Oracle INTERSECT-operator uitgelegd

In Oracle Database, de INTERSECT operator wordt gebruikt om een ​​samengestelde query te maken die het snijpunt retourneert van de resultaten van de linker en rechter SELECT verklaringen. Met andere woorden, het combineert twee query's, maar retourneert alleen die rijen die in beide query's worden geretourneerd.

Voorbeeld

Stel dat we de volgende tabellen hebben:

SELECT * FROM Employees;
SELECT * FROM Customers;

Resultaat:

WERKNEMER-ID NAAM WERKNEMER
1 Bart
2 Jan
3 Ava
4 Rohit
5 Monish
6 Monish
7 Monish
KLANT-ID NAAM KLANT
1 Mia
2 Rohit
3 Peter
4 Ava
5 Monish
6 Monish

We kunnen de INTERSECT . gebruiken operator om werknemers terug te sturen die ook klant zijn:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Resultaat:

NAAM WERKNEMER
Ava
Monish
Rohit

Het retourneert dus alleen die waarden die voorkomen in zowel de Employees tabel en de Customers tafel.

Oracle Database's implementatie van de INTERSECT operator retourneert alleen afzonderlijke rijen. We kunnen dit zien in het bovenstaande voorbeeld. Het retourneert slechts één rij voor Monish, ook al zijn er meerdere werknemers en meerdere klanten met die naam.

Sommige RDBMS'en stellen ons in staat om duplicaten in het resultaat op te nemen door een optionele ALL . te accepteren trefwoord met de INTERSECT operator, maar Oracle is daar niet een van (tenminste, niet op het moment van schrijven). SQLite ook niet.

Een alternatieve zoekopdracht

Het is mogelijk om hetzelfde resultaat te krijgen zonder de INTERSECT exploitant. We zouden ons eerste voorbeeld hier bijvoorbeeld naar kunnen herschrijven:

SELECT 
    DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);

Resultaat:

NAAM WERKNEMER
Rohit
Ava
Monish

Enkele dingen om te onthouden

Houd er rekening mee dat de expressies in aantal moeten overeenkomen en zich in dezelfde gegevenstypegroep moeten bevinden. Daarom kunnen we het volgende niet doen:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId, CustomerName FROM Customers;

Resultaat:

ORA-01789: query block has incorrect number of result columns

Of dit:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId FROM Customers;

Resultaat:

ORA-01790: expression must have same datatype as corresponding expression

We kunnen echter functies gebruiken zoals TO_CHAR() om een ​​kolom te converteren naar een geschikte gegevenstypegroep:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT TO_CHAR(CustomerId) FROM Customers;

Resultaat:

no data found

In dit geval zijn er geen gegevens gevonden omdat geen van de CustomerId waarden kwamen overeen met een van de EmployeeName waarden. Maar als ze dat deden, zouden we de wedstrijden zien.


  1. Hoe van database te wisselen met PostgreSQL

  2. Wat is database-sharding?

  3. Architectuur en afstemming van geheugen in PostgreSQL-databases

  4. psycopg2 hoe om te gaan met TypeError:niet alle argumenten geconverteerd tijdens het formatteren van strings