Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Exists eller In

Postades av 2005-04-07 11:21:19 - Ricky Rehn, i forum sql-server/msde, Tråden har 10 Kommentarer och lästs av 747 personer

Hej !

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)

/Ricky


Svara

Sv: Exists eller In

Postades av 2005-04-07 12:47:55 - Mikael Sand

IN resturnerar en lista och EXISTS kollar bara mot en record.

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 Sand


Svara

Sv:Exists eller In

Postades av 2005-04-07 14:50:43 - Mikael Wedham

IN måste matcha alla rader innan den kan gå vidare.

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


Svara

Sv: Exists eller In

Postades av 2005-04-08 09:38:55 - Ricky Rehn

Vet inte om jag har fattat det rätt, men om man t.ex har följande...

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?

/Ricky


Svara

Sv:Exists eller In

Postades av 2005-04-08 10:13:21 - Mikael Wedham

Ja det stämmer.

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)


/micke


Svara

Sv: Exists eller In

Postades av 2005-04-08 10:30:27 - Christoffer Hedgate

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:

<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>


Svara

Sv:Exists eller In

Postades av 2005-04-08 11:03:57 - Ricky Rehn

Nu tror jag att jag förstår hur man ska använda dom.

Tack fö rhjälpen!

/Ricky


Svara

Sv:Exists eller In

Postades av 2005-04-08 11:17:04 - Håkan Borneland

Intressant!

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åkan


Svara

Sv: Exists eller In

Postades av 2005-04-08 12:20:38 - Christoffer Hedgate

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.


Svara

Sv: Exists är fortfarande ett bättre alternativ

Postades av 2005-04-08 12:33:50 - Mikael Wedham

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 :)

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>
/micke


Svara

Sv:Exists är fortfarande ett bättre alternativ

Postades av 2005-04-08 14:10:39 - Håkan Borneland

OK!

Tackar för infon, Micke och Christoffer.

//Håkan


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 619
27 953
271 709
584
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies