Toon posts:

[Postgres] Vaag query probleem???

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben met een programma bezig (geschreven in C#, gebruik maken van Npgsql (http://gborg.postgresql.org/project/npgsql/projdisplay.php)). Voor dit programma maak ik gebruik van een PostgreSQL database. Deze database heeft (naast andere tabellen) drie tabellen genaamd cd, location en locationdetails. Deze zien er als volgt uit:

cd: title [pk], creationdate, type, fk_storedloc [fk], fk_currentloc [fk]
location: location [pk], capacity, homelocation
locationdetails: fk_cd [pk,fk], fk_location [pk,fk], part, column, row

Het mag duidelijk zijn dat cd.fk_storedloc en cd.fk_currentloc foreign keys zijn, en dat die wijzen naar location.location. Tevens wijzen locationdetails.fk_cd en locationdetails.fk_location naar respectievelijk cd.title en location.location. Tot dusver geen problemen lijkt me.

Nu wil ik echter de volgende query uitvoeren:

SQL:
1
2
3
4
5
SELECT c.*, d1.part AS part1, d1."column" AS column1, d1.row AS row1, 
d2.part AS part2, d2."column" AS column2, d2.row AS row2
FROM cd c, locationdetails d1, locationdetails d2
WHERE c.title = 'TestCD' AND c.fk_storedloc = d1.fk_location 
AND c.fk_currentloc = d2.fk_location


Volgens mij zou dat maar 1 rij moeten geven, maar hij geeft er vier :?. Ik heb de resultaten ffies in een tekstfile'tje op m'n webserver gezet. Die is hier te vinden:
http://members.home.nl/mezach/query_result.txt .

Het lijkt er dus op dat hij alle mogelijke combinaties met de column en row velden neemt. Maar dat is natuurlijk niet de bedoeling. Hij moet gewoon 1 resultaat geven. Iemand een idee hoe dat zit?

Verwijderd

Probeer het zo:
SQL:
1
2
3
4
5
SELECT  distinct c.*, d1.part AS part1, d1."column" AS column1, d1.row AS row1, 
d2.part AS part2, d2."column" AS column2, d2.row AS row2
FROM cd c, locationdetails d1, locationdetails d2
WHERE c.title = 'TestCD' AND c.fk_storedloc = d1.fk_location 
AND c.fk_currentloc = d2.fk_location

en anders alles eens distincten. Btw
locationdetails: fk_cd [fk], fk_location [fk], part, column, row ipv locationdetails: fk_cd [pk,fk], fk_location [pk,fk], part, column, row

Verwijderd

Topicstarter
Verwijderd schreef op 23 June 2003 @ 16:43:
Probeer het zo:
SQL:
1
2
3
4
5
SELECT  distinct c.*, d1.part AS part1, d1."column" AS column1, d1.row AS row1, 
d2.part AS part2, d2."column" AS column2, d2.row AS row2
FROM cd c, locationdetails d1, locationdetails d2
WHERE c.title = 'TestCD' AND c.fk_storedloc = d1.fk_location 
AND c.fk_currentloc = d2.fk_location

en anders alles eens distincten. Btw
locationdetails: fk_cd [fk], fk_location [fk], part, column, row ipv locationdetails: fk_cd [pk,fk], fk_location [pk,fk], part, column, row
Die query geeft precies 't zelfde, dus dat is 't niet denk 'k.

Overigens, waarom zou een foreign key niet tegelijkertijd ook een primary key kunnen zijn? Dat kan toch prima?

Verwijderd

beetje dubbel leek mij maar van mij mag het. Jammer dat distinct het niet doet. Anders probeer je een join.

Verwijderd

Topicstarter
Verwijderd schreef op 23 June 2003 @ 16:48:
beetje dubbel leek mij maar van mij mag het. Jammer dat distinct het niet doet. Anders probeer je een join.
Ehmz, volgens mij is dit al een join. Of bedoel je een outer/inner join?

Ennuhm, een foreign key en een primary key zijn bepaald niet hetzelfde. De primary key geeft aan wat identificerend is binnen een tabel. Een foreign key is een verwijzigen naar iets wat in een andere tabel staat, zodat daar rekening mee gehouden kan worden bij het verwijderen/updaten van die andere tabel.

Verwijderd

Topicstarter
Hmmz, ik heb nu met behulp van een programma de volgende query gebouwt:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 
  "public".cd.title,
  "public".cd.creationdate,
  "public".cd."type",
  "public".cd.fk_storedloc,
  "public".cd.fk_currentloc,
  "public".locationdetails.part,
  "public".locationdetails."column",
  "public".locationdetails."row"
FROM
  "public".locationdetails
  INNER JOIN "public".cd ON ("public".locationdetails.fk_location = "public".cd.fk_currentloc) AND ("public".locationdetails.fk_cd = "public".cd.title)
WHERE
  "public".cd.title = 'TestCD'


En dat geeft dus maar 1 waarde, en 'k denk da'k dan nog een andere query moet uitvoeren voor de fk_currentloc.

[ Voor 27% gewijzigd door Verwijderd op 23-06-2003 17:23 ]


Verwijderd

Topicstarter
Hmmz, ik weet al waarom m'n eigen query niet werkte :). Ik was vergeten om c.title = d1.fk_cd en c.title = d2.fk_cd aan de WHERE clause toe te voegen, daarom deed ie het niet. Bedankt voor de hulp iedereen :).

Verwijderd

Topicstarter
Hmmz, heb nu weer iets vreemds. Ik heb een tabel genaamd rental met de volgende velden:

startdate
followupnr
fk_cd
fk_firstname
fk_lastname
enddate

Hiervan mag alleen de laatste null zijn. En nu wil ik dus alles records hebben waarvan dat veld null is, dus maak ik de query:

SQL:
1
SELECT * FROM rental WHERE enddate = null


Maar dat geeft dus helemaal niks, terwijl er toch wel degelijk twee records zijn waarvan dat veld op null staat. Kan iemand mij dit uitleggen?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

IS NULL ipv = NULL :)

Per sql spec overigens, dus dat je niet denkt dat postgres vervelend doet ;)

[ Voor 69% gewijzigd door ACM op 23-06-2003 23:09 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

modbreak: even een hintje voor Taz:
Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/got/images/icons/edit.gif

Dat ding (deze dus: Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/got/images/icons/edit.gif) staat rechtsbovenin je post en kun je gebruiken om de post te editen om nieuwe informatie toe te voegen. Hiermee voorkom je dat je 4 posts op een rij maakt binnen 6 uur terwijl kicken (wat het gewoon is) binnen 24 uur by-policy verboden is hiero.

Professionele website nodig?


Verwijderd

Topicstarter
IS NULL dus inderdaad, beetje loos dat dat dan ineens IS moet zijn in plaats van =. Maar goed, dat werkt nu dus, bedankt :).

Ennuhm, 'k weet ook wel dat je je posts kan editen, alleen ha'k niet door da'k al vier keer achter elkaar een reply had geschreven. Mijn excuses daarvoor in ieder geval :).

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Nee, das niet loos.

Want NULL betekend dat het niets is. Met = controlleer je dat het iets is en dan zou je dus met '= null' ineens een betekenis aan null toekennen...
Pagina: 1