關於SQL的EXISTS

最近小第在學習資料庫的查詢

但是始終搞不懂EXISTS的方法~

好不容易搞懂了,做題目卻遇到了困難= ="

難道是我還不夠理解嗎??

麻煩大大幫我看一下以下程式碼

-----------------------------------------------------------

查詢供應商在美國或法國或德國的供應商名稱與國家。

select CompanyName, Country

from dbo.Suppliers as s

where exists(select *

from dbo.Suppliers

where Country = s.Country

and Country = 'USA' or Country = 'France' or Country = 'Germany')

我這樣查詢出來的結果...

竟會把所有國家都印出來= =|||

麻煩大大幫我解答一下~

為什麼會這樣>

Update:

只有一張資料表~

用EXISTS查詢

供應商資料表:

供應商名稱 國家

Exotic Liquids UK

Update 2:

Exotic Liquids UK

New Orleans Cajun Delights USA

Grandma Kelly's Homestead USA

Ma Maison Canada

Pasta Buttini s.r.l. Italy

Escargots Nouveaux France

Gai pâturage France

Forêts d'érables Canada

Refrescos Americanas LTDA Brazil

Heli Süßwaren GmbH & Co. KG Germany

Update 3:

回Andrew:

有點不太了解...

意思是,一個EXISTS裡面裡面只能有一個條件式嗎??

例如這樣~

(select * from dbo.Suppliers

where Country = s.Country

and Country = 'USA' )

我這樣的比數跟只查國家是USA的資料是相同的˙˙

所以~您的意思是....一個EXISTS裡面只能有一個判斷式?

Update 4:

回岔題與亂回文程度的能力:

我知道可以這樣寫...但是若要用EXISTS寫呢>

3 Answers

Rating
  • 9 years ago
    Best Answer

    因為我也不是什麼大師,

    只是想提供一點自己理解的想法,

    給您參考,

    如果有什麼錯誤,

    敬請見諒囉~

    依照您的語法,

    是以下這樣解釋的,

    只要子查詢

    (select * from dbo.Suppliers

    where Country = s.Country

    and Country = 'USA' or Country = 'France' or Country = 'Germany')

    存在一筆以上的資料,

    就執行外層的查詢,

    所以乍看之下,

    會覺得答案不對,

    因為子查詢裏面

    有包含

    [where Country = s.Country

    and Country = 'USA' or Country = 'France' or Country = 'Germany']

    這些條件,

    但是最後的結果並沒有包含這些條件。

    其實這是因為,

    在您的查詢中,

    子查詢產生了超過一筆的資料,

    也就是 EXISTS 的條件成立了,

    而此時外層的查詢可以被執行。

    而外層的查詢本身並沒有任何WHERE條件,

    所以查出來會是下面語法查出的結果~

    select CompanyName, Country

    from dbo.Suppliers

    以上請參考囉~

    by 我是誰 2011-05-01

    2011-05-03 13:40:55 補充:

    用EXIST判斷得出的答案只有「執行」或「不執行」兩種,

    用點像IF的感覺,

    當判斷式結果有任一筆資料存在則「執行」

    當判斷式結果無任一筆資料存在則「不執行」

    舉例來說:

    依照您原來的exists(select * ...)

    因為exists判斷式結果是有資料存在,

    所以被判斷成「執行」,就會執行外層的那一串指令,

    但那串指令沒有where條件,所以全部被找出來了

    但如果改成下面的指令:

    exists(select * from dbo.Suppliers where Country = '天堂')

    假設沒有"天堂"這個國家,

    則會被判斷成「不執行」,也不會有執行結果

    提供給您參考囉~

    Source(s): 網路與自己, 網路、自己
  • 因為你的條件下, Suppliers 裡的每一筆資料都會成立...

    select

    CompanyName, Country

    from dbo.Suppliers

    where

    Country in ('USA', 'France', 'Germany');

    這樣寫不就好了....

  • ALESSI
    Lv 6
    9 years ago

    你應該先提供這兩個資料表的內容吧。

    這樣才能正確提出解答

Still have questions? Get your answers by asking now.