2011-08-23 74 views
0

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

Table1 
- ID 
- Name 
- AddedBy 

Table2 
- ID 
- Table1ID 
- Name 
- Type 

Table3 
- ID 
- Table1ID 
- Name 

Table4 
- ID 
- Table2ID 
- Table3ID 
- Age 

我目前得到的所有记录表1为特定用户使用AddedBy场。这个查询看起来是这样的:

SELECT 
    * 
FROM 
    [Table1] t1 
WHERE 
    t1.[AddedBy][email protected] 

现在,我需要从以某种方式与表1相关的第一个表4记录的时代价值。我该怎么做呢?我一直对查询感到困惑。

感谢您提供任何帮助!

+2

你怎么定义“第一”? –

+0

Table1和Table4有什么关系? 1:1,1:很多? – nageeb

+0

投票结束,因为太局部。这是非常基本的SQL,未来任何人都不可能在关于'JOIN's – JNK

回答

2

这是主键如何复合让您更准确地表达你希望你的数据库做一个经典的例证。

鉴于您拥有的型号,看起来Table2Table3是由Table1直接定义的;也就是说,在没有父母Table1记录的情况下拥有Table2记录是没有意义的。同样,它看起来像Table4只有当Table2Table3存在。如果这是真的,那么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记录总是链接到Table2Table3记录与同Table1ID,它简化了原始查询的加入,使其不必经过Table2Table3找到Table4有效记录。

+0

的搜索中遇到这个问题,这是对重新设计的想法。如果不这样做,这将很难查询。是的,是的,是的,以摆脱ID作为ID字段的名称。这是一个SQL反模式,我每次看到它都会畏缩。 – HLGEM