2011-04-27 77 views
2

我有一個關於與MS SQL Server的SQL問題構建動態T-SQL

我有一個表,這樣

customer 
id country_id post_code_id 
1  AU   1 
2  GB   1 

我已經郵政編碼表分隔這樣

post_codes_AU 
post_codes_GB 
etc.. 

是有一種方法可以在查詢中使用country_id來加入正確的表格。例如,

select * from customer c 
inner join post_codes_ '+c.country_id+' as pc on pc.id=c.post_code_id 
+0

如果您將所有post_codes合併到由country_id(或ISO代碼)分隔的單個表格中,則此問題將變成一個簡單的連接。您的設計就是一個很好的例子,因爲缺乏標準化,這種模式已經造成了困難。 – Thomas 2011-04-27 22:54:37

回答

0

如果示例查詢建議的名稱中包含名稱空間,則需要在表名稱周圍放置[]。這看起來像一個錯字,所以你可能不需要這樣做。一旦你這樣做,它應該可以很好地作爲動態SQL。

確保您在使用動態SQL之前瞭解可能的pifalls,然後再轉到該路由。這是值得一讀:

http://www.sommarskog.se/dynamic_sql.html

+0

嘿..我得到的錯誤,即使沒有空間的那個SQL .. – Alessandro 2011-04-27 18:54:57

1

你無法加入這樣的查詢。

爲了讓你能夠做一個適當的查詢如下:

  • 請在post_codes _...表分區視圖,並加入這一觀點
  • 生成每個COUNTRY_ID查詢的客戶表並將它們與UNION ALL聲明粘合在一起。
+0

對於第一個選項,我也建議創建一個存儲過程,將刷新視圖(按需或按某個時間表),建立'drop動態查看/創建視圖腳本並執行它。 – 2011-04-28 05:50:45

0

創建一個視圖並加入;

-- #1 create a view . . . . 
create view MyPostCodes 

as 

select 
    country_id='AU', 
    post_code_id 
from 
    post_codes_AU 
union 
select 
    country_id='GB', 
    post_code_id 
from 
    post_codes_GB 
go 
-- #2 now join like this 
select * from customer c 
inner join MyPostCodes as pc on pc.id=c.post_code_id and pc.country_id=c.country_id 
0

似乎你的查詢會起作用,改變一點。

Select * from customer c 
Inner Join post_codes 
On concat('post_codes_',c.country_id)=Post_codes.post_code_id 

,或者與下面的代碼段一試,

Select * from customer c 
Inner Join post_codes 
On right(1-charindex('_',reverse(post_codes_id)),post_codes_id) =c.country_id 

前相比去掉確切的代碼來比較。