eine Sache verstehe ich nicht und weiß auch nicht, wie ich das Problem lösen kann.
Ich habe folgende Abfrage:
SELECT *, (SELECT COUNT(t_tourdaten.region_id) FROM t_tourdaten
WHERE t_regionen.region_id = t_tourdaten.region_id AND POSITION('' IN art) > 0 AND
POSITION('DE' IN t_tourdaten.lkz) > 0 GROUP BY t_tourdaten.region_id) AS tour_cnt
FROM t_regionen WHERE POSITION('DE' IN t_regionen.lkz) > 0 [color=#ff0000]AND tour_cnt > 0[/color] ORDER BY region
Es wird die Fehlermeldung erzeugt:
ERROR: column "tour_cnt" does not exist
ZEILE 4: ...en WHERE POSITION('DE' IN t_regionen.lkz) > 0 AND tour_cnt >...
********** Fehler **********
ERROR: column "tour_cnt" does not exist
SQL Status:42703
Zeichen:296
Wieso wird diese Fehlermeldung erzeugt? Die Spalte tour_cnt existiert doch.
Wie kann ich die Abfrage so umbauen, dass die Bedingung tour_cnt > 0 erfüllt wird? Da stehe ich im Moment auf dem Schlauch.
Weil man den Alias nicht in der gleichen “Ebene” direkt verwenden kann. Du musst eine derived Table daraus machen:
select *
from (
SELECT *,
(SELECT COUNT(t_tourdaten.region_id)
FROM t_tourdaten
WHERE t_regionen.region_id = t_tourdaten.region_id
AND POSITION('' IN art) > 0
AND POSITION('DE' IN t_tourdaten.lkz) > 0 G
ROUP BY t_tourdaten.region_id) AS tour_cnt
FROM t_regionen
WHERE POSITION('DE' IN t_regionen.lkz) > 0
) t
where tour_cnt > 0
ORDER BY region
Was genau willst Du eigentlich mit der Bedingung AND POSITION(‘’ IN art) > 0 erreichen. Oder ist das ein Tippfehler?
danke für die schnelle Antwort und wieder was gelernt.
Der Ausdruck AND POSITION(’’ IN art) > 0 ist kein Tippfehler. Das Feld art kann folgende Einträge annehmen ‘’, ‘BT’, ‘ST’, ‘KS’ oder Kombinationen davon.
es handelt sich um eine Datenbank, in der ich alle von mir begangenen Bergtouren speichere. Das Feld “art” gibt an, um welche Tourenart es sich handelt: Bergtour(BT), Schneeschuhtour(ST) oder Klettersteig(KS). Es gibt halt dabei auch Kombinationen wie z.B. eine Schneeschuhtour, die man auch als Bergtour machen kann. Dann enthält das Feld “art” “BTST” oder eben Bergtour mit Klettersteig “BTKS”. Siehe hier: Jürgen Dankoweit - FreeBSD-Onkel und Bergfex
Wenn Du so willst, ist das ein Bitfeld.
Aber POSITION(’’ IN art) > 0 liefert immer true zurück wenn art nicht NULL ist.
Wenn Du auf einen leeren String testen willst, dann must Du art = ‘’ verwenden.
Wenn ein leerer String und NULL den gleichen Status identifizieren dann sowas wie coalesce(art, ‘’) = ‘’