2012-11-19 87 views
1

我有三个表。加入超过2个表

  • 表格数据包含来自 “data.txt”文件的各个零件的数据。
  • 表限制包含来自“limits.txt”文件的数据表 的限制。
  • Table Files是 上面每个单独的.txt文件的列表。

所以“文件”表看起来像这样。正如你所看到的,它是存在的每个文件的列表。 LimitsA文件将包含A类型的每个数据文件的限制。

ID File_Name Type Sub-Type 
1 DataA_10 A  10 
2 DataA_20 A  20 
3 DataA_30 A  30 
4 LimitsA A  NONE 
5 DataB_10 B  10 
6 DataB_20 B  20 
7 LimitsB B  NONE 

“数据”表如下所示。 File_ID是“文件”表中的外键。具体而言,这将是以上DataA_10的数据:

ID File_ID Dat1 Dat2 Dat3... Dat20 
1 1  50 52 53 
2 1  12 43 52 
3 1  32 42 62 

“限制”表如下所示。 File_ID是“文件”表中的外键。具体而言,这将是数据,上述LimitsA:

ID File_ID Sub-Type Lim1 Lim2 
1 4  10  40 60  
2 4  20  20 30  
3 4  30  10 20  

所以我想要做的是从相应的“数据”表连接,从“限制”表中的数据正确的极限。 DataA_10的每一行将具有来自LimitsA表的“40”和“60”的限制。不幸的是,没有办法将限制表直接链接到数据表。做到这一点的唯一方法是回头看文件表,看看LimitsA和DataA_10属于A型。一旦我将这两者连接在一起,我就需要特别抓取子类型10的极限。

最后我想看到这样的结果。

结果:

ID File_ID Dat1 Dat2 Dat3... Dat20 Lim1 Lim2 
1 1  50 52 53    40 60 
2 1  12 43 52    40 60 
3 1  32 42 62    40 60 

我希望这是不够清楚明白。在我看来,就像加入2个以上表格的问题一样,但我一直未能在网上找到合适的解决方案。如果您有解决方案或任何建议,将不胜感激。

+0

我不知道限制表的连接标准应该是什么。这些数据如何与文件表相关联?在File_ID或Sub-Type上? – cdhowie

+0

Data表和Limits表的数据通过File_ID链接回File表。 File_ID与File表中相应行的ID相同。 – Stoating

+0

那么为什么Lim1和Lim2对于File_ID为1的文件是40和60?该表中的所有行的File_ID均为4. – cdhowie

回答

1

您的'文件'表实际上是2个独立的(但相关的)已被合并的概念。如果你使用子查询打破它们,你将有更容易的时间进行连接。需要注意的是加入这样是不是最有效的方法,但再也不是给定的模式...

SELECT Data.*, Limits.Lim1, Limits.Lim2 
FROM (SELECT * FROM Files WHERE SubType IS NOT NULL) DataFiles 
JOIN (SELECT * FROM Files WHERE SubType IS NULL) LimitFiles 
    ON LimitFiles.Type = DataFiles.Type 
JOIN Data 
    ON DataFiles.ID = Data.File_ID 
JOIN Limits 
    ON LimitFiles.ID = Limits.File_ID 
    AND DataFiles.SubType = Limits.SubType 
ORDER BY Data.File_ID 

UPDATE

要如何改进架构更为具体:目前, Files表没有明确的方法来区分数据和限制文件条目。除此之外,数据条目没有与单个限制文件条目的明确链接。虽然这两种方法都可以像上面的SQL一样算出来,但这样的逻辑可能无法在查询优化器中很好地发挥作用,并且当然不能保证您需要的数据限制链接。

考虑这些选项:

  • 通过Type,直接链接到了一个极限进入Id链接到“限价”文件,而不是。在该链接上设置外键以确保预期的限制条目可用。
  • 通过将它们在一个单独的表独立于“数据”条目“限制”的条目。
  • 在外键上创建一个索引。对于这个问题,为所有外键添加索引--SQL Server默认不会这样做。

其中,我会考虑有一个外键是必不可少的,其他人作为适度的改进。

+0

更好的模式会是什么?我是SQL新手。 的情况是有一台机器创建.txt文件具有相同的文件表我FILE_NAME列名。然后,我将这些单个文件中的数据放入通过File_ID链接回Files表的Data或Limit表中。 这似乎是制作表格的最合理的方法,但我可能错过了一些更好的方法。 – Stoating

+0

更新了建议。这些都不需要执行您需要的查询。但是,如果这个模式将长期存在,那么这些改进当然应该被考虑。 – PinnyM