连接具有多个表的表

时间:2013-11-25 19:02:41

标签: sql sql-server

我有一张桌子

Table_1 (
   id int,
   tablename varchar(max),
   createdDate datetime
)

现在让我们假设有20行id 1-20。因此tablename包含20个不同的名称(name1,name2,...,name20)。现在这些名称在同一个数据库中有自己的n行表。

表名的格式:

name1(
   slno int,
   data varchar(100),
   createdby int,
   processeddate datetime
)

name2(
   slno int,
   data varchar(100),
   createdby int,
   processeddate datetime
)
...
name20(
   slno int,
   data varchar(100),
   createdby int,
   processeddate datetime
)

现在我创建了

temp_table(
   ID int,
   tablename varchar(max),
   createdby int,
   createdDate datetime
) 

将存储来自相应tablename

的ID,tablename,createddate和created.

帮助我开发一个填充temp_table的查询。

2 个答案:

答案 0 :(得分:2)

更新如何让您的疯狂数据看起来更好

首先阅读我的评论

您可以使用下面的查询使您的数据看起来像设计良好的表格(然后使用它来迁移到干净的设计):

SELECT 1 as dataid, 'name1' as name, s1no, data, createdby, processdate FROM name1
  UNION ALL 
SELECT 2 as dataid, 'name2' as name, s1no, data, createdby, processdate FROM name2
  UNION ALL 
SELECT 3 as dataid, 'name3' as name, s1no, data, createdby, processdate FROM name3
  UNION ALL 
-- etc
  UNION ALL 
SELECT 20 as dataid, 'name20' as name, s1no, data, createdby, processdate FROM name20

这可能应该是一个评论,但在评论区域内没有表达的余地。

您的数据模型存在缺陷。不应该有1-N表。应该有一列代表这些信息 - 当人们第一次开始使用关系数据时,这是一个常见的错误。

以下是我如何设置它:

表格表格

dataid int,        -- this is the same as the 1-20 
name varchar(max), -- you probably don't need this since you have an ID
slno int,
data varchar(100),
createdby int,
processeddate datetime

因此,使用此表格,您可以选择dataid = x以获得与在设计中选择特定表格相同的结果。我建议在此列中添加一个索引(因为每个选择都会使用它。)

现在我们有了更好的设计。我还不清楚你要求设计的查询。

例如,要查看创建它们时存在的“表格”列表以及它们拥有的行数,您只需执行此操作:

 SELECT dataid as tableid, 
        min(name) as name,
        min(processdate) as createdate, 
        max(processdate) as lastaccess,
        count(*) as numberrecords
 FROM tablestable
 GROUP BY dataid

答案 1 :(得分:0)

感谢每一位给我这么重要时刻的人。 经过长时间的耐心,我解决了这个问题。

对于此问题,需要SQL动态查询。 怎么样,我要解释......

While ((Select Count(*) From Table_1) > 0 )
Begin
Declare @ID int = (Select top 1 ID From Table_1),
        @tableName varchar(max) = (select TableName From Table_1 where id = @id),
        @CreatedDate DateTime = (select CreatedDate From Table_1 Where id = @id),
        @Createdby int,
        @Data int,
        @query1 varhcar(max)
        set @query1 = '
                       Select @Createdby =  (select top 1 createdby From +'@tableName'+ ),
                              @Data = (Select Count(data) From +'@tableName'+ )
                      '
        declare @query2 varchar(100)
        set @query2 = '@Createdby output,@Data output'
        exec sp_executesql @query1,
                           @query2,
                           @Createdby = @Createdby output,
                           @Data = @Data output
        insert into Temp_table
        Values(@ID,@TableName,@Createdby,@createddate)
        Delete From Table_1 where id = @id
end
Select * from Temp_table