SQL 多个表的查询

GIS2007_S 2009-03-20 09:44:41
表分为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语句如何写啊?请高手指教!
...全文
323 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
messi_yang 2009-05-14
  • 打赏
  • 举报
回复
學習 學習 ~1
  • 打赏
  • 举报
回复
学习,看看
bbschen1988 2009-03-23
  • 打赏
  • 举报
回复
21楼主给你解答了值得探讨
bhtfg538 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zzxap 的回复:]
这种表设计的确很有问题
[/Quote]

这种设计 非常灵活,对于 架构经常变动的 表,非常有必要


这是一种设计思路
CutBug 2009-03-20
  • 打赏
  • 举报
回复
--测试数据begin
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)
--查询部分end

drop 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
*/
zzxap 2009-03-20
  • 打赏
  • 举报
回复
分表1完全可以用一个表保存
zzxap 2009-03-20
  • 打赏
  • 举报
回复
这种表设计的确很有问题
zhangyanyang 2009-03-20
  • 打赏
  • 举报
回复
学习一下
二马化拾 2009-03-20
  • 打赏
  • 举报
回复
个人认为,这样的数据结构有点问题.
GIS2007_S 2009-03-20
  • 打赏
  • 举报
回复
表分为2种:总表和分表,总表只有一个,分表有n个。结构如下:
总表 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 -
- -
- -
- -

多谢各位的参与!
bhtfg538 2009-03-20
  • 打赏
  • 举报
回复
LZ,如果 表结构 大致一样,就是我这样写

如果 你的表字读 都不一样

类似于 动态架构绑定 这种 设计方式很巧妙
具体 操作 可以 参考 Ben-Gan 的 Inside T-SQL中的 方案
bhtfg538 2009-03-20
  • 打赏
  • 举报
回复
DECLARE @总表 TABLE (Id INT IDENTITY(1,1) PRIMARY KEY,表名 NVARCHAR(4))

INSERT INTO @总表 SELECT 'A'
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 @all

DECLARE @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



zzxap 2009-03-20
  • 打赏
  • 举报
回复
string sql=" "
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
zzxap 2009-03-20
  • 打赏
  • 举报
回复
[code=C#]

string sql=" "
string table='分表'
for (i=1,i<1000,i++)
{
table+='table'+i.Tostring
sql+=" select 类型,编码,x,y from 总表 left join "+ table +" on 总表.编码="+ table +".编码 union all "

}

[/CODE]
zzxap 2009-03-20
  • 打赏
  • 举报
回复
[code=C#]
玩玩
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 "

}

[/CODE]
bhtfg538 2009-03-20
  • 打赏
  • 举报
回复
表名,都是从 总表取出来的
稍等
GIS2007_S 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 icjava 的回复:]
个人认为,这样的数据结构有点问题.
数据库应该根据需要设计,固定的模式不一定是最好的!
GIS2007_S 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 icjava 的回复:]
个人认为,这样的数据结构有点问题.
数据库应该根据需要设计,固定的模式不一定是最好的!
CutBug 2009-03-20
  • 打赏
  • 举报
回复
表名有一定规律才好用动态sql
CutBug 2009-03-20
  • 打赏
  • 举报
回复

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'
加载更多回复(10)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧