【发布时间】:2014-06-07 03:23:54
【问题描述】:
我有三张桌子:
Document DocumentExt Tracking
------------------------- ----------------- --------------------------------------------
ID | Name | DocType DocId | OtherId ID | DocOtherId | DocType | AccessTime
------------------------- ----------------- --------------------------------------------
1 SomeDoc Z 1 Doc1 1 Doc2 X [Date here]
2 SomeDoc2 X 2 Doc2 2 A [Date here]
3 SomeDoc3 Y 3 Doc3 3 Doc1 Z [Date here]
... ... ... ... ... ... ... ... ...
注意Tracking.DocOtherId 中的缺失值。这是一个不可为空的字段,默认为空字符串。
问题是我需要对这两个执行连接,其中包括Tracking 中的每条记录的一行,以及来自Document 的相关信息。比如:
SELECT
Tracking.ID, Document.Name
FROM
Tracking
INNER JOIN
DocumentExt ON DocumentExt.OtherId = Tracking.DocOtherId
INNER JOIN
Document ON Document.ID = DocumentExt.DocId
但是,由于Tracking.DocOtherId 不可为空,因此查询将为DocumentExt 和Tracking 中的每个记录返回一行。为了查询的目的,我需要将 Tracking.DocOtherId 视为可为空,以便 JOIN 正常工作。有没有办法做到这一点?
EDIT:我想我需要说明我需要为Tracking 中的EACH 记录返回ONE 记录,包括DocOtherId 中的空字符串。
例如:
TrackingId | DocumentName
---------------------------
1 SomeDoc2
2 NULL
3 SomeDoc1
... ...
EDIT 2:标记为关闭。我做错了,我采取了完全不同的方法。
【问题讨论】:
-
你不能添加一个 where 子句说 WHERE Tracking.DocOtherId ''?
-
三个表的 ID 列是否相同?如果您在 SomeDoc 上获得另一个 Tracking 条目,它在 Tracking 中的 ID 是否仍为 1?
-
1.如果有这么多空字符串,为什么 DocOtherId 是不可为空的字段? 2.您的数据集是否如此庞大以至于仅使用 docotherid 不为空的跟踪数据创建一个临时表会令人望而却步?
-
@Asdfg,不,我不能,很遗憾。因为
DocumentExt中没有空字符串值的记录,所以不会对空字符串进行比较。添加这样的记录可能会给整个数据库带来灾难性的后果。 -
也许如果您添加了预期的输出,您可能会得到答案。目前尚不清楚您的期望或为什么 LEFT JOIN 不适合您。
标签: sql sql-server tsql inner-join