我有三张桌子彼此之间有着相当奇怪的关系,我正试图从中获取一些数据,但没有想出一个好方法。这三个表基本上是:
“A”表包含有关总体范围的信息。为了论证,让我们说表A包含你已经拥有的工作列表或类似的东西。 A.Id
是A的主键。
“B”表包含与“A”表有关的事项的“聚光灯”。 B.Id
是B的主键,它有一个B.Timestamp
来表示事件发生的时间,它有一个B.AId
列来指示它引用的“A”。
这是事情变得复杂的地方。 “C”表包含与“B”中某些条目相关的信息。它有两列,主要是C.Bid
和C.Value
。如果你去SELECT * FROM A JOIN B ON B.AId = A.ID LEFT JOIN C ON C.Bid = B.Id
,你会留下这样的东西:
A.Id B.Id C.Value (... and other columns, of course...)
1 1 12
1 2 NULL
1 3 NULL
1 4 13
1 5 NULL
2 6 91
2 7 12
2 8 NULL
2 9 NULL
2 10 NULL
3 11 92
3 12 91
3 13 NULL
3 14 92
等...
现在,我在“B”表中获得了时间戳,可帮助我了解C.Value
何时发生变化,但如果我想查看C.Value
的预期值,该怎么办?当B.Id
= 10时?基于那里的数据,我知道正确的答案仍然是C.Value = 12
,因为它没有改变,但我没有很好的可视化方法。
所以,基本上,我要求的是帮助构建一个查询,可以显示A.Id, B.Id
和最近的非空 C.Value
使用{ {1}}作为标准。 Ids有时会出现故障,但时间戳总是正确的。
谢谢!
答案 0 :(得分:0)
我承认我还没有完全理解这个问题。具有预期结果的样本数据确实会有所帮助。 Especialyl其中A有3个B ID记录,只有最早或第二个最早的记录与C中的值有关。
SELECT A.ID, B.ID, C.Value
FROM A
INNER JOIN B
on A.ID = B.AID
INNER JOIN (SELECT AID, max(timestamp) mTimeStamp
FROM B
INNER JOIN C
on B.ID = C.BID
WHERE C.Value is not null
GROUP BY AID) Z
on B.AID = Z.AID
and B.TimeStamp = Z.mTimeStamp
LEFT JOIN C
on C.BID = B.ID
因此,我们从有限集合中返回A.ID,B.ID,C.value中的所有值。
加入内联视图' Z'我们将B记录限制为那些具有非空C值的每个AID值的MAX(时间戳)。从而消除所有不具有C值的A.ID和B.ID;谁不是最大的。
这假设如果你有一个带有多个B ID的A.ID的情况说1,2,3且只有2有一个值。那么你想要那条记录(2)不是3。
我想我们可以使用一个存在的查询来查看有问题的BID是否存在于带有值的C表中,但是由于您希望返回的值对我更有意义。