SQL 左外连接不提供完整表

标签 sql tsql 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

当我运行这样的常规查询时:
SELECT
    Sequence.n
FROM
    @Sequence as Sequence 

我得到了我的期望 - 96 行 DateTime 值以 5 分钟为间隔,结束于 06-25-2010 00:00:00(此值稍后将被 SSRS 报告中的参数替换,这就是为什么指定 ' 可能看起来很奇怪的原因end' 并使用双 DATEADD)。

现在第二个表包含由 PLMC Controller 注册的值,并且它们也恰好每 5 分钟注册一个记录(每个 pointID,但为了不复杂,假设有一个 PointID)。

问题是有时控​​制器脱机,对于给定的点没有注册值,甚至没有 0。这就是为什么如果我想从任何给定点获得过去 8 小时的全貌,我想出了这个序列 table 。因此,如果我使用此查询从同一时间范围内的另一个表中获取值:
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'

我只会得到 56 行。这是因为当天20:30后 Controller 下线,没有记录注册。

所以问题就在这里。我尝试运行此查询以每 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'

不幸的是,结果仍然是 56 行,与上次查询的时间戳相同......我已经尝试了所有可能的连接,但无法获得当天最后 3,5 小时的 Null 值。我确定我犯了一个非常简单的错误,但我已经尝试了几个小时的不同方法来解决它,我非常需要帮助。

解决了:
感谢您的评论,在阅读了 Blorgbeard 的第一个评论后,我开始修改查询。我所要做的就是对我的时间序列 x 所有相关的点 ID 进行卡氏乘法(因为我不需要全部),因此我的“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 

再次感谢您的帮助!

最佳答案

您需要将 PointID 比较移动到 ON 子句中 - 在 WHERE 子句中使用它,您将强制 LEFT JOIN 成为 INNER JOIN:

ON Sequence.n = PointValue.DataTime AND
   PointValue.PointID = '5280'

结果集中的每一行都必须满足 WHERE 子句中的条件。

关于SQL 左外连接不提供完整表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5259459/

相关文章:

sql - 检索具有最近 5 个不同日期的所有记录

mysql - 如何在mysql上使用 "group by"之前的 "join"?

mysql - MySQL JOIN 查询/计数问题

sql - 左连接中的最新记录

MySQL:将两个没有公共(public)ID的表合并在一起

mysql - 忽略关系表上其他用户的行

c# - 无法将参数值从SqlParameter转换为String

sql - 不允许新事务,因为 session 中还有其他线程正在运行。 SQL Server 中的错误

sql-server-2005 - 索引性能 BigInt 与 VarChar

javascript - Lodash:通过给定键连接值