在SQL Server中查询子表

时间:2011-08-23 13:18:37

标签: sql sql-server sql-server-2008

我在SQL Server 2008数据库中有一个数据库。我的数据库模型形成一个带有四个表的菱形图案。这四个表定义如下:

Table1
- ID
- Name
- AddedBy

Table2
- ID
- Table1ID
- Name
- Type

Table3
- ID
- Table1ID
- Name

Table4
- ID
- Table2ID
- Table3ID
- Age

我目前通过使用AddedBy字段获取特定用户的所有Table1记录。此查询如下所示:

SELECT
  * 
FROM
  [Table1] t1
WHERE
  t1.[AddedBy]=@someuser

现在,我需要从第一个与Table1相关联的Table4记录中获取Age值。我该怎么做呢?我一直对这个问题感到困惑。

感谢您提供任何帮助!

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

这是复合主键如何让您更准确地表达您希望数据库执行操作的经典说明。

鉴于您拥有的模型,Table2Table3似乎由Table1直接定义;也就是说,没有父Table2条记录的Table1记录没有意义。同样,当{em> Table4Table2存在时,Table3似乎才有意义。如果是这样,那么Table2Table3Table4应该在这些行中包含复合主键:

Table2
-------------
Table1ID     -- consider renaming this in Table1 so that the same name is used 
                throughout
RecordNumber -- unique within a given Table1ID; this is only needed if one of 
                your other two columns cannot serve as a unique value within 
                Table1ID, which I'm guessing one of them can

然后你会为Table3做类似的事情。然后,对于Table4,您将拥有:

Table4
-------------
Table1ID
Table2RecordNumber
Table3RecordNumber

作为主键,然后设置两个外键,一个到Table2上(Table1ID, Table2RecordNumber),一个到Table3上(Table1ID, Table3RecordNumber)。这样,您就可以确保Table4条记录始终链接到Table2Table3Table1ID的记录,并简化原始查询中的联接,以便它不会不必通过Table2Table3查找Table4中的有效记录。