2011-04-27 113 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 

前相比去掉确切的代码来比较。