Where-Klausel an falscher Stelle wird nicht erkannt

Hallo,

ist das ein Bug oder ein Feature?

Ich habe zwei Tabellen:
tabelle_1 = (sensor_ID, datum, tabelle)
tabelle_2 = (sensor_name, ID)

Die SQL-Abfrage lautet:

SELECT * from tabelle_1
where sensor_ID =
(SELECT ID from tabelle_2
where sensor_name = ‘temperatur’
and datum < ‘2009-10-20’
)

“datum” kommt nur in tabelle_1 vor, die SQL-Abfrage
funktioniert aber trotzdem richtig. Bin irritiert. :confused:
Korrekt wäre

SELECT * from tabelle_1
where sensor_ID =
(SELECT ID from tabelle_2
where sensor_name = ‘temperatur’
)
and datum < ‘2009-10-20’

Diese Abfrage liefert exakt das gleiche Ergebnis wie die erste.
Ich hätte erwartet, dass es eine Fehlermeldung gibt.
Kann es sein, dass der Ausdruck in der Klammer eine Tabelle
und eine noch nicht ausgewertete Bedingung ergibt, die dann
beide außerhalb der Klammer weiter verarbeitet werden?
Das widerspricht aber dann der Klammerung.
Kommentare?

Nett.

test=*# explain SELECT * from tabelle_1
test-# where sensor_ID =
test-# (SELECT ID from tabelle_2
test(# where sensor_name = 'temperatur'
test(# and datum < '2009-10-20'
test(# );
                               QUERY PLAN
------------------------------------------------------------------------
 Seq Scan on tabelle_1  (cost=0.00..26976.50 rows=6 width=40)
   Filter: (sensor_id = (subplan))
   SubPlan
     ->  Result  (cost=0.00..24.50 rows=6 width=4)
           One-Time Filter: ($0 < '2009-10-20'::date)
           ->  Seq Scan on tabelle_2  (cost=0.00..24.50 rows=6 width=4)
                 Filter: (sensor_name = 'temperatur'::text)
(7 rows)

Es wird zuerst der Scan auf tabelle_2 gemacht, mit der Bedingung (sensor_name = ‘temperatur’::text). Das ist der Sub-Plan. Dann erfolgt die Anfrage von Tabelle_1 mit der Resultat des Subplanes und der Filterbedingung ($0 < ‘2009-10-20’::date).

PG ist smart genug zu erkennen, wann es die Bedingungen prüfen kann. Ich würde das aber in die Kategorie ‘schlechtes SQL’ einordnen.


Andreas