2011-12-21 44 views
1

enter image description here循環中的連接查詢和使用IN子句連接查詢之間的區別是什麼?

這是我的數據庫表格表示。

我正在做inner join從這些表中獲取數據 的查詢如下。

查詢-1

select * from Trips 
     Inner join TripPoints 
       On Trips.tripkey=Trippoints.tripkey 
     inner join Cars 
       On Trips.carid=Cars.cid 
       and Cars.cid IN ('1','2','3','4','5','6') 
       where (lat>='4.0' and lat<='5.0') 
        and 
       (long>='52' and long <='54') 

查詢-2

for(int carId=1;carId<=6;carId++) 
     { 
     select * from Trips 
     Inner join TripPoints 
      On   
      Trips.tripkey=TripPoints.tripkey 
      inner join Cars 
      on 
      Trips.carid=Cars.cid and CARS.cid = carId 
     where 
     (lat>='4.0' and lat<='5.0') 
      and 
     (long>='52' and long <='54') 
     } 

兩個查詢執行成功。

但是查詢-1給出比更少的記錄查詢-2

查詢有什麼區別會導致結果差異?

+0

你使用哪個數據庫有'for'循環結構? – Oded

+0

我使用C#構建sql查詢,數據庫是mySQL 5.0。 –

回答

0

第一個查詢僅返回一個包含所需信息(6行)的結果。

第二個查詢返回6個結果,因爲您創建了6個不同的選擇(每個選擇1行)。


每個選擇都會給出結果!

1

在第二查詢中,這樣:

Trips.carid=Cars.cid and CARS.cid = carId 

...將被視爲這樣的:

Trips.carid = Cars.cid AND Cars.cid = Trips.carid 

...這當然是與此相同:

Trips.carid = Cars.cid 

換句話說,SQL中的carId的外觀正在被視爲列caridTrips,而不是您所期望的C#變量carId。因此,這兩個查詢之間的唯一語義不同的是,第一有這樣的:

and Cars.cid IN ('1','2','3','4','5','6') 

...這第二個沒有,因此,因爲必須存在比其他值值Cars.cid第一查詢返回的行較少'1'至'6'(含)。