Postgres加入不尊重外部where子句

时间:2013-12-06 16:18:35

标签: postgresql

在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)

http://sqlfiddle.com/#!15/a172c/2

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;

sqlfiddle demo

如果要为每个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

sqlfiddle demo

派生表会获取最新读数的记录,然后JOIN会从事物表中获取该记录的信息。

答案 1 :(得分:0)

SQL中的where子句适用于您请求的结果集,而不适用于连接。

你的代码没有说:“只为ID 1加入<...

你的代码在说什么:“做这个加入,然后从ID中取出ID为1的记录......”

这就是你需要inner where子句的原因。顺便说一句,我也认为菲利普对于不必要的代码是正确的。