2013-11-25 86 views
-1

我有一个表加入多个表

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 
) 

将存储ID,表名,createddate和createdby从各自tablename

帮助我建立一个查询填写temp_table

+4

你的设计是可怕的 - 你是在大麻烦。 – Hogan

+0

感谢Octoshape以完美的方式设计我的查询 –

回答

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 
+0

伙计们请投我,因为我面临与我的stackoverflow帐户答案禁止问题! –

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 
+0

+1您的努力的荣誉。对于上面的评论中的咆哮抱歉:D – Octoshape

+0

@霍根对不起,但这没有用! –

+0

@MindHunter对不起,但我不能帮助,除非你告诉我为什么?你是否已经有表格了?我可以给你一个查询把它们变成这张表。 – Hogan