2012-01-11 9 views
0

私は3つのテーブルを作成しました。各表のすぐ初心者のために質問するヘルプ

tblRegion{RegionID as Integer, RegionName as varchar(100)}, 

tblCountries{CountryID as Integer, CountryName as varchar(100), RegionID as varchar(3)}, 

tblUsrs{UserID as Integer, UserName as varchar(100), PrefRegion as varchar(3), PrefCountries as varchar(100)} 

データ:

tblRegion 
--------- 
RegionID RegionName: 
1 Asia -- 
2 Africa -- 
3 Europe -- 
4 America 

tblCountries 
------------- 
CountryID CountryName RegionID: 
1 China 1 -- 
2 Malaysia 1 -- 
3 Singapore 1 -- 
4 Afganistan 3 -- 
5 UK 3 -- 
6 Spain 3 -- 
7 Libiya 2 -- 
8 Morocco 2 -- 
9 US 4 -- 
10 Canada 4 -- 
11 Mexico 4 

tblUsrs 
------- 
UsrID UsrName PrefRegion PrefCountries: 
1 Mike 2 -1 -- 
2 John -1 '1,5,9' -- 
3 Michael -1, '1' -- 
4 Tango -1 '8,9' 

上記のデータから、ユーザは2として領域を通過し、両方のユーザID 1 & 4が表示される場合。

私は質問を書いていますが、間違っているようです。サブ副選択が正しい場合でも、副選択は意味をなさない(「または」の後)

Select * 
from tblUsers 
where (PrefRegion = '2') or ('2' in (
     Select RegionID 
     from tblCountries, tblUsers 
     where convert(varchar,tblCountries.CountryID) in (tblUsers.PrefCountries) 
     ) 
    ) 

答えて

0

wherclauseの第二の部分 - それは領域IDに対する2でtblUsers選択に影響を与えていないかどうかを見つけますすべて。

EDIT:それは読みやすくしてくれてありがとうミハル:)

おそらく、あなたが必要なもの、これはあなたの選択の3行目にある:

where (PrefRegion = '2') and (PrefRegion in (the rest of the subselect)) 
+0

これは動作していません – Learner

+0

動作しないwhatsのもう少し詳細を教えてください。 SQLエラーまたは誤った結果セット。 – dbrin

+0

データから見ると、PrefRegionはユーザー1とユーザー4のPrefRegion = -1では2ですが、国番号8のPrefCountriesが再び地域2の下にあります。 – Learner

0

あなたがする必要があるように見える何がユーザーに参加しています他の二つのテーブルにテーブル、次のように:

SELECT * 
FROM regions 
INNER JOIN users_temp ON regions.rid = users_temp.prefRegionID 
INNER JOIN countries ON users_temp.prefCountryID = countries.cid 

WHERE(users_temp.prefRegionID = 2) AND (users_temp.prefCountryID = 2) 

これらのテーブルは次のように参加されるだろう210

enter image description here

デザインからプレフィックスtblを削除しました(必要ではありません)。ユーザーは1つの優先地域と国しか持たないと仮定しました。そうでない場合は、アソシエーションタイプテーブルを使用して、各ユーザーの多くの優先値を格納します。