从所有细分子表中获取值

时间:2010-08-05 12:21:57

标签: sql sql-server-2005

我有三张表格如下。

TransactionTable
----------------
TransactionID
Status
Value
FileNo      (int)
FileType        - 'E' indicates Email,  'D' Indicates Document


EmailTable
----------
EmailFileNo (Identity)
ReceivedDate
....
....
....



DocumentsTable
---------------
DocFileNo   (Identity)
ReceivedDate
.....
.....

EmailTable和TransactionTable之间以及DocumentsTable和TransactionTable之间存在一对多的关系

此类关系的名称是什么......我只使用了细分子表格这个术语

我需要选择TransactionID,ReceivedDate,其中状态为'P'的值...

我可以使用

获得结果
Select A.TransactionID, IsNull(B.ReceivedDate, C.ReceivedDate)  as ReceivedDate, A.Value
    From TransactionTable as A 
        Left outer join EmailTable as B on A.FileNo = B.EmailFileNo and A.FileType='E'
        Left outer join DocumentsTable as C on A.FileNo = C.DocFileNo and A.FileType = 'D'
                   where A.Status = 'P' 

以上查询为我提供了预期的结果... 这是应该做的方式还是有更好的方法来处理这种情况?

编辑:包含在复制粘贴操作期间遗漏的where子句。谢谢你指出这一点。

2 个答案:

答案 0 :(得分:0)

有人可能会有更好的回应,但这就是它。您可以选择允许可变数量参数的COALESCE而不是ISNULL,因此如果由于某种原因,电子邮件和文档都为NULL,则可以添加第三个选项。

以下所有内容都只是对架构的评论。表结构有一个问题,但我确定你现在已经在这些表已经建立后进行编码,所以这不一定是行动的召唤。你可能不得不和他们一起生活。

我的本​​能反应是将TransactionId分配给子表,因为它们现在不是正式的孩子。它们是TransactionTable碰巧引用的自治对象。

在我有一个没有明确定义的关键列之前我遇到了类似的问题,我最终选择了它。在TransactionTable上为FileNo构建正式约束/外键是不可能的,因为FileNo可以在两个表中的任何一个上定义。

(顺便提一下,您的查询中缺少status = 'P'项检查。)

此外,如果您继续添加“E”和“D”之外的新文件类型,则必须继续将查询扩展到新表。某种形式的文件表,其中的关键字段可能是解决此问题的一种方法。 [据我所知,你可能已经有了某种文件表]

不确定是否有任何帮助。如果不改变表结构,就无法改进查询。

答案 1 :(得分:0)

您的查询看起来不错。我发表的唯一评论是,我认为您不满足您在要求中指定的Status ='P'条件。

Select A.TransactionID, IsNull(B.ReceivedDate, C.ReceivedDate)  as ReceivedDate, A.Value
    From TransactionTable as A 
        Left outer join EmailTable as B 
            on A.FileNo = B.EmailFileNo 
                and A.FileType='E'
        Left outer join DocumentsTable as C 
            on A.FileNo = C.DocFileNo 
                and A.FileType = 'D'
    where A.Status = 'P'