表分为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.   

    用union
    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.编码 
      

  2.   

    LEFT JOIN .
    Select * from 总表 A Left join 分表1 S1 ON A.编码=S1.编码 LEFT JOIN 分表2 S2 ON A.编码=S2.编码
    .....
    WHERE 
    A.编码=???
      

  3.   

    手动编写  inner join
    或者使用动态的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)
      

  4.   


    这样是不行的。如果有 1000个表  你要写多少个  UNION ALL?
    请看  6楼的回复 
    动态EXEC
      

  5.   


    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' 
      

  6.   

    表名有一定规律才好用动态sql
      

  7.   


    玩玩
    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 "}
      

  8.   

    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 "}
      

  9.   

    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
      

  10.   

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

  11.   

    LZ,如果 表结构 大致一样,就是我这样写如果 你的表字读 都不一样类似于  动态架构绑定 这种 设计方式很巧妙 
    具体 操作 可以 参考 Ben-Gan 的 Inside T-SQL中的 方案
      

  12.   

    表分为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        - 
    -    - 
    -    - 
    -    - 多谢各位的参与!
      

  13.   

    --测试数据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)
    --查询部分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
    */
      

  14.   


    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.编码
      

  15.   

    [Quote=引用 17 楼 icjava 的回复:]
    个人认为,这样的数据结构有点问题.
    数据库应该根据需要设计,固定的模式不一定是最好的!
      

  16.   

    [Quote=引用 17 楼 icjava 的回复:]
    个人认为,这样的数据结构有点问题.
    数据库应该根据需要设计,固定的模式不一定是最好的!