webForumDet fria alternativet

Jämföra två tabeller och se vad som inte är lika

Databaser & SQL

7 svar · 323 visningar · startad av Davida

Medlem sedan okt. 2000219 inlägg
Frågan#1

Jag har gjort ett frågeformulär där de som har anmält sig ska svara på frågor. Nu har jag 1000 anmälda och 408 svarande, jag vill skicka ett mail till de som inte har svarat. Hur gör jag för att plocka ut epostadresserna till de som inte har svarat?

TABELL: Anmälda
============
epostadress

TABELL: Svarande:
==============
epostadress

Medlem sedan dec. 200012 464 inlägg
#2
select epostAdress
from anmälda 
where not exists (
select *
from svarande
where anmälda.epostadress = svarande.epostadress)

Flyttas från ASP

Medlem sedan nov. 20017 144 inlägg
#3

Vad är skillnaden mellan LarsGs och denna?

SELECT epostadress FROM anmälda WHERE NOT epostadress IN (SELECT epostadress FROM svarande)
Medlem sedan dec. 20003 887 inlägg
#4

LarsG är snabbare.

EXISTS avbryter så fort den hittar en post som uppfyller villkoret.

Medlem sedan nov. 20017 144 inlägg
#5

Med en äldre verson av mySql så kan du göra så här:

SELECT distinct a.epostadress FROM anmälda a
LEFT JOIN svarande s ON s.epostadress=a.epostadress 
WHERE s.epostadress IS NULL

Engine^ : Aha. :)

Medlem sedan nov. 20017 144 inlägg
#6

Jag brukar ibland fråga om en sql-fråga är "rätt".
Då brukar svaret bli:
Är resultatet det du förväntade dig?
-> Ja
Då är det rätt.

Men eftersom att det uppenbarligen i många fall går att få fram samma resultat med fler olika frågor så måste det ju uppenbarligen finnas bättre och sämre frågor.
Bara en tanke. :)

Medlem sedan juni 2004533 inlägg
#7

Engine^ skrev:

LarsG är snabbare.
EXISTS avbryter så fort den hittar en post som uppfyller villkoret.

Visserligen, men även om den avbryter sökningen så fort den hittar en adress så måste den ändå göra en sökning för varenda post i tabellen.

Varanten med IN skapar en mängd av adresser som den söker i. Vad som är effektivast av de två är inte så lätt att säga.

Varianten med JOIN tror jag är den effektivaste. Den gör ett resultat genom att matcha ihop tabellerna och filtrerar det med ett enkelt villkor. Helt vanliga databasoperationer, och därför troligast det som databasen är bäst optimerad för.

Medlem sedan dec. 200012 464 inlägg
#8

Om två frågor är ekvivalenta så kan man inte säga att den ena är effektivare på grund av att den kan utföras på ett visst sätt. SQL är ett deklarativt språk.

325 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
117 ms — deklarationer (db)
0 ms — hämta statistik (cache)
191 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)