PGSQL: Falls kein Eintrag vorhanden was anderes annehmen

Hallo @ll,

aus Perfonmancegründen, will ich 2 Abfragen integrieren, da die zweite sonst für jeden Eintrag im ResultSet des ersten aufgerufen wird.

Nun habe ich folgende Frage:
Ich habe eine Tabelle poi(poi_id :int , name, address)
und eine Tabelle images_poi(poi_id :int, img_url :String)

Bei folgender Abfrage kommt der Fehler:
ERROR: invalid reference to FROM-clause entry for table "p"
Die INNER JOIN s haben bevor ich versuchte die img_url mit abzufragen einwandfrei funktioniert.

Die Abfrage:
Code:
String sql = "SELECT DISTINCT p.poi_id, name, address, i.img_url FROM poi p, images_poi i INNER JOIN ratings r ON p.poi_id =r.poi_id WHERE i.poi_id = p.poi_id AND r.uid like "+user;
	   			
sql = sql +" UNION SELECT DISTINCT p.poi_id, name, address, i.img_url FROM poi p, images_poi i WHERE i.poi_id = p.poi_id AND p.poi_id NOT IN(SELECT DISTINCT p.poi_id FROM poi p INNER JOIN ratings r ON p.poi_id =r.poi_id WHERE r.uid like "+user+")";

Das Problem liegt wahrscheinlich daran, dass die Tabelle images_poi für die meisten poi_id (noch) keinen Eintrag enthält. Kann ich nun während der Abfrage erzwingen, dass im Resultset der Eintrag für das Attribut img_url mit z.B NULL gefüllt wird?

Vielen dank für Hilfe im Voraus :)

LG,
hugo
 
Hallo,

nvl ist zum ausscheiden von null-values von variablen, rückgabewerten etc. vorgesehen,
meintest du das :

Code:
sql = sql +" 
UNION SELECT DISTINCT 
                    p.poi_id
                    , name
                    , address
                    , nvl(i.img_url , 'DEIN FUELLWERT')
FROM 
                   poi p
                   , images_poi i 
WHERE 
                  i.poi_id = p.poi_id 
                  AND p.poi_id NOT IN(
                                      SELECT DISTINCT 
                                                        p.poi_id 
                                      FROM              poi p 
                                      INNER JOIN        ratings r ON p.poi_id =r.poi_id WHERE r.uid like "+user+"
)";

Es wäre nett wenn Du nicht so lange Zeilen posten könntest.

Hoffe es hilft

Liebe Grüße
 
Hallo Danke erstmal für die Hilfe :)

Leider hat dies das Problem nicht gelöst, so kriege ich leider kein Resultset, aber auch keine Fehlermeldung.

Wie gesagt, die Tabelle images_poi hat nur 2-3 Einträge, und die poi ca. 200..

lg,hugo
 
Hallo,
dann solltest du anstatt der ersten WHERE clausel evtl. LEFT JOIN verwenden.

Etwa so:
Code:
sql = sql +" 
UNION SELECT DISTINCT 
                    p.poi_id
                    , name
                    , address
                    , nvl(i.img_url , 'DEIN FUELLWERT')
-- -------------------------- alte syntax ----------------------------------------
--FROM 
                   --poi p
                   --, images_poi i 
                  
-- WHERE 
                 --  i.poi_id = p.poi_id 
-- ------------------------------------------------------------------------------------
FOM            poi p
LEFT JOIN   images_poi i on p.poi_id = i.poi_id

";

Left join erklärung: http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/chap7.htm#leftjoin

Damit solltest du eine ausgabe bekommen die Rechts die 200 Einträge anzeigt und Links nur die 2-3.

Grüße
 
Hallo vielen Dank nochmals..

kam leider heute erst wieder dazu hieran zu arbeiten..
Die Joins sind nun gut, allerdings kriege ich plötzlich den Fehler:

Code:
postgresql.util.PSQLException: ERROR: 
function nvl(character, "unknown") does not exist

In den PGSQL Funktionen konnte ich nvl() auch nicht finden?
 
Hallo,
postgresql.util.PSQLException: ERROR:
function nvl(character, "unknown") does not exist

Dann must du die standart CASE / WHEN function nehmen, also etwa so:
PHP:
sql = sql +" 
UNION SELECT DISTINCT 
                    p.poi_id
                    , name
                    , address
                    , CASE 
                              WHEN i.img_url is NULL
                              THEN  'DEIN FUELLWERT' 
                              ELSE i.img_url
                     END AS "img_url"
-- -------------------------- alte syntax ----------------------------------------
--FROM 
                   --poi p
                   --, images_poi i 
                  
-- WHERE 
                 --  i.poi_id = p.poi_id 
-- ------------------------------------------------------------------------------------
FOM            poi p
LEFT JOIN   images_poi i on p.poi_id = i.poi_id

";


Wenn du es noch besser machen willst schau dir die INFO hier an:
COALESCE

Viel Glück
 
Zurück