sql >> Database >  >> RDS >> Sqlserver

SQL Server SOMMIGE operator uitgelegd

In SQL Server kunt u de SOME logische operator om een ​​scalaire waarde te vergelijken met een reeks waarden met één kolom die door een subquery worden geretourneerd.

Het kan worden gebruikt met subquery's die een resultatenset van één kolom hebben.

De SOME operator is het equivalent van de ANY logische operator.

Voorbeeld

Stel je voor dat we twee tabellen hebben; Cats en Dogs

Katten

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+

Honden

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
+---------+-----------+

Laten we nu een subquery uitvoeren met de ANY telefoniste.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);

Resultaat:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

SOME vs ANY

Zoals vermeld, SOME is het equivalent van ANY .

Dus we kunnen onze zoekopdracht wijzigen om ANY . te gebruiken in plaats van SOME .

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);

Resultaat:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

SOME vs IN

We zouden hetzelfde resultaat krijgen als we de query zouden veranderen zodat deze de IN . gebruikt operator in plaats van SOME .

Hier gebruikt het de IN telefoniste.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName IN (SELECT DogName FROM Dogs);

Resultaat:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

SOME vs EXISTS

We zouden hetzelfde kunnen doen met de EXISTS telefoniste.

Hier gebruikt het de EXISTS telefoniste.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);

Resultaat:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

Fout 116?

Als je fout 116 krijgt bij het gebruik van SOME , komt dit waarschijnlijk omdat u meerdere kolommen in uw subquery selecteert. De SOME operator kan alleen worden gebruikt met subquery's die een resultatenset van één kolom hebben.

Hier is een voorbeeld van hoe we deze fout kunnen veroorzaken.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = SOME (SELECT * FROM Dogs);

Resultaat:

Msg 116, Level 16, State 1, Line 5
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

We zouden dezelfde fout krijgen met IN . Als u meerdere kolommen in uw subquery moet retourneren, gebruikt u EXISTS .


  1. Wat is het verschil tussen door komma's gescheiden joins en join op syntaxis in MySQL?

  2. Snapshot controlfile-functie met RMAN en ORA-00245

  3. Inzicht in de sortering op databaseniveau en de impact van het wijzigen ervan voor een database

  4. Hoe SQL Server 2017 &2019 gelijktijdig op een Mac te draaien