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文件
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 ID1
链接到类型相同的文件\u ID4
的限制输入('a'
)。请看下面我的答案。更好的模式是什么?我是SQL新手。情况是有一台机器正在创建.txt文件,其名称与文件表中的“我的文件名”列相同。然后,我将这些单独文件中的数据放入一个数据或限制表中,该表通过File_ID链接回files表。这似乎是创建表的最合乎逻辑的方法,但我可能遗漏了一些更好的方法。使用建议更新。执行所需的查询不需要这些。然而,如果这个模式要长期存在,这些改进当然应该考虑。