2013-07-26 69 views
-1

我有4個表,promoSchedule從國家和狀態表獲取數據

id | startdate | enddate 
1 |1 july | 10 july 
2 |1 july | 20 july 
3 |2 july | 30 july 
4 |1 july |15 aug 

和3個表,promoScheduleCountry,promoScheduleState和promoScheduleCity。這些表格中的數據是:

promoScheduleCountry 
id | promoScheduleId | countryId 
1 | 1    | US 

promoScheduleStates 

id | promoScheduleId | stateId 
1 | 2    | New york 



promoScheduleCities 
id | promoScheduleId | cityId 
1 | 3    | Amsterdam 
2 | 4    | Geneva 

國家,州和城市被關閉。

現在希望所有的promoScheduleIds其中,如果提供countryId說,美國,再從3個表即promoScheduleCountry,promoScheduleState和promoScheduleCity,我想promoScheduleIds 1,2,3,4。

如果我promovide stateId說紐約,然後從2表即promoScheduleState和promoScheudleCity,我想promoScheduleIds 2,3,4。

我希望查詢或存儲過程爲此或指南如何做到這一點?
爲了理解目的,我避開了國家,州和城市的名字。實際上還有3個國家,州和城市的桌子。並且它們與每一個狀態表相關,即國家主鍵和城市表中有主鍵狀態表

+1

'promoScheduleCountry','promoScheduleState'和'promoScheduleCity'之間的關係是什麼? – hims056

+1

您必須在這些表格之間存在某種關係,或者您必須有另一個表格來定義哪個城市屬於哪個州,哪個州屬於哪個國家/地區。糟糕的DB設計。 –

+0

如果這三個表之間存在關係,那麼您可以得到適當的查詢或存儲過程輸出。 –

回答

0

這不是對你的問題的直接回答,而是更多的關於設計的查詢的表格,這似乎有點複雜(正如您在查詢時發現的那樣)。

你可以用一個PromoLocations表更換你的三個promoXXX表:

ID PromoScheduleID CountryID StateID CityID 

這很可能使你的代碼容易得多代碼和查詢。

0

你應該重新設計你的表像下

CountryTable : CountryID (int, autonumber, PK), CountryName (varchar2) 
StateTable  : StateID (int, auto number, PK), StateName (varchar2), ContryID (int , FK) 
CityTable  : CityID (int, auto number, PK), CityName (varchar2), StateID (int, FK) 

,而不是使用這三promoScheduleCountry,promoScheduleStates,promoScheduleCities表,創建新的這樣

PromoLocation : PromoLocationId (int, autonumber, PK), PromoScheduleID (int, FK), CountryID(int, FK), StateID(int, FK), CityID(int, FK) 
所有表中

虛擬數據會像

CountryTable 
--------------------------- 
CountryID | CountryName 
--------------------------- 
1   | USA 
2   | France 
3   | Russia 
4   | India 
--------------------------- 

StateTable 
----------------------------------------- 
StateID  | StateName | CountryID 
----------------------------------------- 
1   | New York | 1 
2   | Alaska  | 1 
3   | Michigan | 1 
----------------------------------------- 

CityTable 
----------------------------------------- 
CityID  | CityName | StateID 
----------------------------------------- 
1   | Albany  | 1 
2   | Buffalo  | 1 
3   | Rochester | 1 
----------------------------------------- 

PromoSchedule 
----------------------------------------- 
promoScheduleid  | PromoEventName 
----------------------------------------- 
1     | Event1   
2     | Event2 
3     | Event3 
4     | Event4 
---------------------------------------- 

PromoLocation 
-------------------------------------------------------------------------------------- 
PromoLocationID  | PromoScheduleID  | CountryID | StateID  | CityID 
-------------------------------------------------------------------------------------- 
1     | 1     | 1   |    | 
2     | 2     |    | 1   | 
3     | 3     |    |    | 1 
4     | 4     |    |    | 2 
--------------------------------------------------------------------------------------- 

您的查詢會像

SELECT * FROM PromoSchedule WHERE promoScheduleid IN 
(SELECT promoScheduleid FROM PromoLocation WHERE CountryID = '<CountryID>' OR 
     StateID IN (SELECT StateID FROM StateTable WHERE CountryID = '<CountryID>') OR 
     CityID IN (SELECT * FROM StateTable WHERE StateID IN (SELECT StateID FROM StateTable WHERE CountryID = '<CountryID>'))) 

這也可以使用JOIN來完成。

+0

實際上將所有數據插入到promoLocation表中將會很難維護。國家,州和城市之間的關係是完全一樣在我的表和它的ID在promoScheduleCountry,promoScheduleState和promoScheduleCity表中使用。 – vishal

+0

如果我必須使用promoScheduleCountry,promoScheduleState和promoScheduleCity表怎麼會查詢 – vishal

+0

比你可以用臨時表,從所有三個表獲取promoScheduleId並將其存儲在臨時表和使用臨時表的promoScheduleId比獲取結果 –