Hej ! IN resturnerar en lista och EXISTS kollar bara mot en record. IN måste matcha alla rader innan den kan gå vidare. Vet inte om jag har fattat det rätt, men om man t.ex har följande... Ja det stämmer. Nja, det stämmer inte riktigt, framförallt inte att "IN <b>måste</b> matcha alla rader innan den kan gå vidare". Tidigare var detta ett klassiskt råd, men iom att optimeraren blivit mer avancerad är det inte så applicerbart längre. EXISTS och IN är (när de används för att beskriva samma önskade resultat) bara olika sätt att logiskt beskriva vad man vill ha, hur dessa sedan fysiskt hanteras är upp till optimeraren. Jämför t ex exekveringsplanerna för nedanstående tre frågor: Nu tror jag att jag förstår hur man ska använda dom. Intressant! Nja, till att börja med finns det en hel del info på sql-server-preformance.com som inte är helt korrekt. Men i just detta fallet är det väl korrekt, eftersom det är aldrig fel att använda EXISTS (där man kan använda EXISTS och IN för samma resultat). Däremot är det inte längre så att IN _alltid_ fungerar sämre än EXISTS. Det är lättare att skriva en kass fråga med IN - Om man har MYCKET komplicerade selectsatser, inte så fåniga som vi visat exempel på, är det lätt att blanda ihop och förirra sig in i en för jobbig IN-sats. Mycket lättare att få till en EXISTS, som dessutom funkar (minst) lika bra som en IN - sen kör faktiskt inte alla senaste SP på SQL 2000 heller, så som generell rekommendation för att få bra kod - och snabb även på SQL 7.0 gäller fortfarande mitt uttalande :) OK!Exists eller In
Någon som vet vad skillnaden är på att använda EXISTS eller IN.
dvs. vad är skillnaden på dessa ?
select col1, col2 from tblA
where col1 IN (select col1 from tblB)
select col1, col2 from tblA
where col1 EXISTS (select col1 from tblB)
/RickySv: Exists eller In
Enligt hjälpen för SQL-server så:
IN:
Determines if a given value matches any value in a subquery or a list.
EXISTS:
Specifies a subquery to test for the existence of rows.
Sen använder du dem på samma sätt i ditt exempel, och därför ser de lika ut.
<code:sql>
If EXISTS Select id from Kunder begin ...
</code>
<code:sql>
If @KundId in ( Select KundId from Kunder ) begin..
</code>
Ser du skillnaden??
//Mikael SandSv:Exists eller In
EXISTS matchar bara första förekomsten (EXISTS (SELECT *...) använder alltså alla=det bästa indexet för svaret men söker inte igenom hela...)
EXISTS är snabbare/effektivare än IN - om de inte gör samma sak.
/micke Sv: Exists eller In
select * from tblA
where nr in (select nr from tblB where nr > 50)
så returnerars ett recordset från tblA där rader med nr > 50 finns med.
och om man har följande...
select * from tblA
where exists (select nr from tblB where nr > 50)
så returneras alla eller inga rader från tblA, beroende på om det blir någon "träff" i tblB.
eller är jag helt fel på det?
/RickySv:Exists eller In
Korkat att göra så bara...
1. Du borde ha någon form av korrelation, alltså i din EXISTS bör du ha en referens till tabellen utanför.
T.ex.
select * from tblA a
where exists (select nr from tblB b where b.id = a.id AND nr > 50)
2. SELECT * i din exists
select * from tblA a
where exists (select * from tblB b where b.id = a.id AND nr > 50)
3. Inte SELECT * i din SELECT
select kolumn, kolumn2... from tblA a
where exists (select * from tblB b where b.id = a.id AND nr > 50)
/mickeSv: Exists eller In
<code>
USE Northwind
DECLARE @orderid INT
SET @orderid = 10253
SELECT *
FROM dbo.Products
WHERE ProductID IN (SELECT ProductID FROM dbo.[Order Details] WHERE OrderID = @orderid)
SELECT *
FROM dbo.Products x
WHERE EXISTS (SELECT * FROM dbo.[Order Details] WHERE ProductID = x.ProductID AND OrderID = @orderid)
</code>Sv:Exists eller In
Tack fö rhjälpen!
/RickySv:Exists eller In
Christoffer: Jag brukar utgå från nedanstående.
<b>When you have a choice of using the IN or the EXISTS clause in your Transact-SQL, you will generally want to use the EXISTS clause, as it is usually more efficient and performs faster. [6.5, 7.0, 2000] Updated 10-30-2003</b>
Det är hämtat från "SQL-Server-Performance.com" http://www.sql-server-performance.com/
Är detta är "gammal" info (enligt ditt inlägg ovan)??
//HåkanSv: Exists eller In
Sv: Exists är fortfarande ett bättre alternativ
Exempel på en EXISTS som faktiskt (än) är bättre...
<code>
SELECT * INTO tempdb..OrderDetails FROM [Northwind]
USE TempDB
GO
SET STATISTICS IO ON
IF EXISTS(SELECT * FROM OrderDetails
WHERE orderid = 10248)
PRINT 'yes'
ELSE
PRINT 'no'
IF (SELECT COUNT(*) FROM OrderDetails
WHERE orderid = 10248) > 0
PRINT 'yes'
ELSE
PRINT 'no'
SET STATISTICS IO OFF
drop table orderdetails
</code>
/mickeSv:Exists är fortfarande ett bättre alternativ
Tackar för infon, Micke och Christoffer.
//Håkan