cuu*_*uba 3 sql t-sql join left-join
我搜索过类似的问题,但我一无所获......
我在SQL中连接2个表时遇到问题.使用以下过程创建第一个表
DECLARE @Sequence TABLE (n DATETIME NOT NULL)
DECLARE @Index INT
SET @Index = 1
WHILE @Index <= 96 BEGIN
INSERT @Sequence (n) VALUES (DATEADD(Minute, @Index * 5, DATEADD(Hour, -8, '06-25-2010 00:00:00')))
SET @Index = @Index + 1
END
Run Code Online (Sandbox Code Playgroud)
当我运行这样的常规查询时:
SELECT
Sequence.n
FROM
@Sequence as Sequence
Run Code Online (Sandbox Code Playgroud)
我得到了我所期望的 - 96行,DateTime值间隔5分钟,结束06-25-2010 00:00:00(此值稍后将被SSRS报告中的参数替换,这就是为什么指定'可能看起来很奇怪'结束范围并使用双DATEADD).
现在第二个表包含由PLMC控制器注册的值,并且它们也恰好每5分钟注册一个记录(每个点ID,但不要使其复杂化,假设有一个PointID).
问题是,有时控制器会脱机,并且对于给定的点,没有注册的值,甚至不是0.这就是为什么如果我想从任何给定的点获得最后8小时的完整图片我想出了这个序列表.因此,如果我使用此查询在同一时间范围内从另一个表中获取值:
SELECT
DataTime, DataValue
FROM
PointValue
WHERE
PointValue.DataTime > DATEADD(Hour, -8, '06-22-2010 00:00:00')
AND PointValue.DataTime < '06-22-2010 00:00:00'
AND PointID = '5284'
Run Code Online (Sandbox Code Playgroud)
我只会得到56行.这是因为当天20:30之后控制器离线并且没有注册记录.
所以这就是问题所在.我尝试运行此查询以获得每5分钟一个值,并希望在20:30之后仍然可以看到整个96行(间隔5分钟为8小时)的空值:
SELECT
Sequence.n,
PointValue.DataValue
FROM
@Sequence as Sequence LEFT OUTER JOIN PointValue
ON Sequence.n = PointValue.DataTime
WHERE
PointID = '5280'
Run Code Online (Sandbox Code Playgroud)
不幸的是,结果仍然是56行,与最后一个查询具有相同的时间戳...我已经尝试了每个可能的连接,并且无法获得当天最后3,5小时的Null值.我确定我犯了一个非常简单的错误,但我已经尝试了不同的方法来解决它几个小时,我真的需要帮助.
已解决:感谢您的评论,我已经开始在阅读Blorgbeard出现的第一条评论后修改查询.我所要做的只是将我的时间序列x所有相关的pointIDs(因为我不需要全部)进行运用倍增,因此我的'FROM'看起来如下:
(SELECT Sequence.n, dbo.LABELS.theIndex FROM @TimeSequence as Sequence, dbo.LABELS
WHERE LEFT(dbo.LABELS.theLabel,2)='VA') as BaseTable
LEFT OUTER JOIN PointValue ON BaseTable.n = PointValue.DataTime AND BaseTable.theIndex = PointValue.PointID
Run Code Online (Sandbox Code Playgroud)
再次,谢谢你的帮助!
您需要将PointID比较移动到ON子句中 - 在WHERE子句中,您强制LEFT JOIN成为INNER JOIN:
ON Sequence.n = PointValue.DataTime AND
PointValue.PointID = '5280'
Run Code Online (Sandbox Code Playgroud)
在WHERE子句中的条件必须通过在结果集的每一行都得到满足.