表分为2种:总表和分表,总表只有一个,分表有n个。结构如下:
总表 分表1 (对应001) 分表2(对应002) 分表3 (对应003) ----
类型 编码 ID 编码 X坐标 Y坐标 ID 编码 X坐标 Y坐标 ID 编码 X坐标 Y坐标 ----
A 001 1 001 12 32 1 002 44 22 1 003 55 22
A 001 2 001 22 11 2 003 66 25
B 002 3 001 77 44
C 003 -
D 004 -
- -
- -
- -
总表与分表通过 关系 连接。现在如何总表获得每个分表中的X、Y坐标? 用SQL语句如何写啊?请高手指教!
总表 分表1 (对应001) 分表2(对应002) 分表3 (对应003) ----
类型 编码 ID 编码 X坐标 Y坐标 ID 编码 X坐标 Y坐标 ID 编码 X坐标 Y坐标 ----
A 001 1 001 12 32 1 002 44 22 1 003 55 22
A 001 2 001 22 11 2 003 66 25
B 002 3 001 77 44
C 003 -
D 004 -
- -
- -
- -
总表与分表通过 关系 连接。现在如何总表获得每个分表中的X、Y坐标? 用SQL语句如何写啊?请高手指教!
select 类型,编码,x,y from 总表 left join 分表1 on 总表.编码='001' and 总表.编码=分表1.编码
union all
select 类型,编码,x,y from 总表 left join 分表2 on 总表.编码='002' and 总表.编码=分表2.编码
union all
select 类型,编码,x,y from 总表 left join 分表3 on 总表.编码='003' and 总表.编码=分表3.编码
Select * from 总表 A Left join 分表1 S1 ON A.编码=S1.编码 LEFT JOIN 分表2 S2 ON A.编码=S2.编码
.....
WHERE
A.编码=???
或者使用动态的SQL
先获取表名字
declare @str varchar(max)
select @str=isnull(@str,'')+表+',' from 总表通过侧分, 批凑一个表集合
然后 批凑出
decalre @sql nvarchar(max)
set @sql=N'
select x,y from 表1
union all
select x,y from 表2';
exec(@sql)
这样是不行的。如果有 1000个表 你要写多少个 UNION ALL?
请看 6楼的回复
动态EXEC
select 类型,编码,x,y from 总表 left join 分表1 on 总表.编码=分表1.编码 where 总表.编码='001'
union all
select 类型,编码,x,y from 总表 left join 分表2 on 总表.编码=分表2.编码 where 总表.编码='002'
union all
select 类型,编码,x,y from 总表 left join 分表3 on 总表.编码=分表3.编码 where 总表.编码='003'
玩玩
string sql=" "
string table='分表'
for (i=1,i<1000,i++)
{
table+='table'+i.Tostring
sql+=" select 类型,编码,x,y from 总表 left join "+ table +" on 总表.编码=分表1.编码 union all "}
string table='分表'
for (i=1,i<1000,i++)
{
table+='table'+i.Tostring
sql+=" select 类型,编码,x,y from 总表 left join "+ table +" on 总表.编码="+ table +".编码 union all "}
string table='分表'
for (i=1,i<1000,i++)
{
table='table'+i.Tostring
sql+=" select 类型,编码,x,y from 总表 left join "+ table +" on 总表.编码="+ table +".编码 union all "}把最终的sql最后一个union all去掉执行SQL
UNION ALL
SELECT 'B'
UNION ALL
SELECT 'C'
UNION ALL
SELECT 'D'CREATE TABLE A (Id INT IDENTITY(1,1))
CREATE TABLE B (Id INT IDENTITY(1,1))
CREATE TABLE C (Id INT IDENTITY(1,1))
CREATE TABLE D (Id INT IDENTITY(1,1))INSERT INTO A DEFAULT VALUES
INSERT INTO B DEFAULT VALUES
INSERT INTO C DEFAULT VALUES
INSERT INTO D DEFAULT VALUES
--查看所有表
DECLARE @all NVARCHAR(MAX)
SELECT @all=ISNULL(@all,'')+表名+',' FROM @总表SELECT @allDECLARE @SQL NVARCHAR(MAX)SET @SQL='';
declare @i int
set @i=1
WHILE @i<=len(@all)
begin
set @sql=@sql+N'select id from '+SUBSTRING(@all,@i,1)+' union all '
set @i=@i+2
end
set @sql=substring(@sql,1,len(@sql)-10)
select @sql
exec(@sql)
drop table a
drop table b
drop table c
drop table d
具体 操作 可以 参考 Ben-Gan 的 Inside T-SQL中的 方案
总表 001 002 003 ----
类型 编码 ID 编码 X坐标 Y坐标 ID 编码 X坐标 Y坐标 ID 编码 X坐标 Y坐标 ----
A 001 1 001 12 32 1 002 44 22 1 003 55 22
A 001 2 001 22 11 2 003 66 25
B 002 3 001 77 44
C 003 -
D 004 -
- -
- -
- - 多谢各位的参与!
create table 总表(类型 nchar(1),编码 nchar(3))
insert into 总表
select 'A','001' UNION ALL
select 'B','002' UNION ALL
select 'C','003' create table [001](ID int,编码 nchar(3),X坐标 int,Y坐标 int)
insert into [001]
select 1 , '001', 12, 32 union all
select 2 , '001', 33, 32 create table [002](ID int,编码 nchar(3),X坐标 int,Y坐标 int)
insert into [002]
select 1 , '002', 33, 55 union all
select 2 , '002', 44, 32 create table [003](ID int,编码 nchar(3),X坐标 int,Y坐标 int)
insert into [003]
select 1 , '003', 1, 2 union all
select 2 , '003', 44, 66
--测试数据end--查询部分begin
declare @sql varchar(8000)
set @sql=''
select @sql = @sql+' select 总表.类型,总表.编码,X坐标,Y坐标 from 总表 left join ['+编码+']
on 总表.编码=['+编码+'].编码 where 总表.编码='''+编码+''' union all'
from 总表
set @sql = stuff(@sql,len(@sql)-9,10,'')
exec(@sql)
--查询部分enddrop table 总表
drop table [001]
drop table [002]
drop table [003]/*输出
类型 编码 X坐标 Y坐标
---- ---- ----------- -----------
A 001 12 32
A 001 33 32
B 002 33 55
B 002 44 32
C 003 1 2
C 003 44 66
*/
SELECT
Z.类型,
Z.编码,
Z1.X坐标 AS 分表1X坐标,
Z1.Y坐标 AS 分表1Y坐标,
Z2.X坐标 AS 分表2X坐标,
Z2.Y坐标 AS 分表2Y坐标,
Z3.X坐标 AS 分表3X坐标,
Z3.Y坐标 AS 分表3Y坐标
FROM 总表 AS Z
LEFT JOIN 分表1 AS Z1 ON Z.编码=Z1.编码
LEFT JOIN 分表2 AS Z2 ON Z.编码=Z2.编码
LEFT JOIN 分表3 AS Z3 ON Z.编码=Z3.编码
个人认为,这样的数据结构有点问题.
数据库应该根据需要设计,固定的模式不一定是最好的!
个人认为,这样的数据结构有点问题.
数据库应该根据需要设计,固定的模式不一定是最好的!