Sql 连接两个以上的表

Sql 连接两个以上的表,sql,join,Sql,Join,我有三张桌子 表数据包含来自某个零件的单个零件的数据 “data.txt”文件 表限制包含数据表的限制 从“limits.txt”文件 表文件是 上面的每个.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 Limit

我有三张桌子

  • 表数据包含来自某个零件的单个零件的数据 “data.txt”文件
  • 表限制包含数据表的限制 从“limits.txt”文件
  • 表文件是 上面的每个.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是“Files”表中的外键。具体而言,这将是上述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是“Files”表中的外键。具体而言,这将是上述LimitsA的数据:

ID  File_ID  Sub-Type  Lim1  Lim2
1   4        10        40    60    
2   4        20        20    30    
3   4        30        10    20    
因此,我要做的是将“Limit”表中的正确限制连接到相应“data”表中的数据。数据A_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

我希望这是足够清楚的理解。在我看来,这似乎是一个连接两个以上表的问题,但到目前为止,我还无法在网上找到合适的解决方案。如果您有解决方案或任何建议,我们将不胜感激。

您的“文件”表实际上是两个已合并的独立(但相关)概念。如果您使用子查询将它们分离出来,那么创建联接就容易多了。请注意,像这样连接不是最有效的方法,但同样,给定的模式也不是

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
更新

更具体地说,如何改进模式:目前,
Files
表没有明确的方法来区分数据和限制文件条目。除此之外,数据条目没有与单个限制文件条目的明确链接。尽管这两个问题都可以在上面的SQL中解决,但这种逻辑可能无法很好地与查询优化器配合使用,并且肯定不能保证您所需的数据限制链接

考虑以下选项:

  • 不要通过
    类型链接到“限额”文件,而是直接链接到限额条目
    Id
    。在该链接上设置外键,以确保预期的限制条目可用
  • 通过将“限制”项与“数据”项放在单独的表中,将其与“限制”项分开
  • 在外键上创建索引。为此,请为所有外键添加索引-默认情况下SQL Server不会这样做

这些,我会考虑外键是必要的,而其他的则是适度的改进。

我不知道限制表的连接标准应该是什么。这些数据与文件表的关系如何?在文件\ ID或子类型上?数据表和限制表的数据都通过文件\ ID链接回文件表。文件\ ID与其在文件表中对应行的ID相同。那么,对于文件\ ID为1的文件,为什么Lim1和Lim2分别为40和60?该表中的所有行的文件ID均为4。@cdhowie,文件表是限制文件和数据文件的组合。因此,类型为
'a'
的数据输入文件\u ID
1
链接到类型相同的文件\u ID
4
的限制输入(
'a'
)。请看下面我的答案。更好的模式是什么?我是SQL新手。情况是有一台机器正在创建.txt文件,其名称与文件表中的“我的文件名”列相同。然后,我将这些单独文件中的数据放入一个数据或限制表中,该表通过File_ID链接回files表。这似乎是创建表的最合乎逻辑的方法,但我可能遗漏了一些更好的方法。使用建议更新。执行所需的查询不需要这些。然而,如果这个模式要长期存在,这些改进当然应该考虑。