我有三张表格如下。
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子句。谢谢你指出这一点。
答案 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'