在SQL Server中,我确定知道以下查询;
SELECT things.*
FROM things
LEFT OUTER JOIN (
SELECT thingreadings.thingid, reading
FROM thingreadings
INNER JOIN things on thingreadings.thingid = things.id
ORDER BY reading DESC LIMIT 1) AS readings
ON things.id = readings.thingid
WHERE things.id = '1'
仅在thingreadings
限制记录设置后才会加入WHERE id = 1
。它只能连接一行。但是,为了在postgres中接受性能,我还必须将WHERE id= 1
添加到INNER JOIN things on thingreadings.thingid = things.id
行。
这不理想;是否有可能强制postgres知道我加入的内容只有一行而没有在任何地方明确添加WHERE
条款?
这里可以看到这个问题的一个例子;
我正在尝试以更有效的方式重新创建以下查询;
SELECT things.id, things.name,
(SELECT thingreadings.id FROM thingreadings WHERE thingid = things.id ORDER BY id DESC LIMIT 1),
(SELECT thingreadings.reading FROM thingreadings WHERE thingid = things.id ORDER BY id DESC LIMIT 1)
FROM things
WHERE id IN (1,2)
答案 0 :(得分:1)
不确定为什么你做了所有这些工作。内部查询不够吗?
SELECT t.*
FROM thingreadings tr
INNER JOIN things t on tr.thingid = t.id AND t.id = '1'
ORDER BY tr.reading DESC
LIMIT 1;
如果要为每个thingID选择最新值,可以执行以下操作:
SELECT t.*,a.reading
FROM things t
INNER JOIN (
SELECT t1.*
FROM thingreadings t1
LEFT JOIN thingreadings t2
ON (t1.thingid = t2.thingid AND t1.reading < t2.reading)
WHERE t2.thingid IS NULL
) a ON a.thingid = t.id
派生表会获取最新读数的记录,然后JOIN会从事物表中获取该记录的信息。
答案 1 :(得分:0)
SQL中的where
子句适用于您请求的结果集,而不适用于连接。
你的代码没有说:“只为ID 1加入<...
你的代码在说什么:“做这个加入,然后从ID中取出ID为1的记录......”
这就是你需要inner where子句的原因。顺便说一句,我也认为菲利普对于不必要的代码是正确的。