Hét vraag- en antwoordplatform van Nederland

Hoe kan ik met SQL een kolom uit een referentie tabel halen?

Het is alweer te lang geleden.

Ik heb een hoofdtabel "items" met de velden: Id, naam, inhoud.
Er is een referentietabel "Labels" met de velden Id, labeltekst
Er is een koppeltabel "ItemLabel" met de velden Id, ItemID, LabelID.

Nu wil ik een select maken waarbij er een uitdraai is van de hoofdtabel "items" met de kolomen Id, naam, inhoud, label

Een gewone sql query is dan SELECT Id, naam, inhoud FROM Items
Hoe ziet de query eruit waarbij de labeltekst wordt opgezocht voor die rij uit de koppeltabel en de referentietabel?

Toegevoegd na 10 minuten:
OK ik heb nu dit...

SELECT items.id, labels.text, items.title, items.text
FROM items
INNER JOIN ItemLabel
ON items.id=ItemLabel.Item
INNER JOIN Labels
ON ItemLabel.Label=Labels.ID

Maar dit geeft alleen nog maar de items die ook een label hebben. Terwijl er ook items zijn ZONDER labels. De query moet alle items zijn (met en zonder label).

Toegevoegd na 12 minuten:
Laat maar, ik ben eruit (dank zij w3schools). Het is zo lang geleden...

SELECT items.id, labels.text, items.title, items.text
FROM items
LEFT JOIN ItemLabel
ON items.id=ItemLabel.Item
LEFT JOIN Labels
ON ItemLabel.Label=Labels.ID

Verwijderde gebruiker
13 jaar geleden
2.3K
rose
13 jaar geleden
Die laatste LEFT JOIN hoeft niet eens, dat kan denk ik ook gewoon een join zijn...

Heb je meer informatie nodig om de vraag te beantwoorden? Reageer dan hier.

Het beste antwoord

Probeer i.p.v. INNER JOIN ItemLabel eens LEFT OUTER JOIN ItemLabel
(Lees meer...)
rose
13 jaar geleden
Verwijderde gebruiker
13 jaar geleden
Dank je. Ik zie dat je goud hebt in deze category. Misschien kan je me helpen nog. In die database SQLite, zit ook een time stamp. Als ik gewoon via de query ruw exporteer naar een excel bestand, dan kan excel er met die kolom geen datum/tijd van maken. Krijg alleen ########## Heb ook een paar commando's geprobeerd van SQLite voor datum/tijd, maar ook daarmee lukt het niet om een goede uitkomst te maken. Ik heb bijvoorbeeld 1293893960 wat de datum 1 januari 2011 3:59PM moet zijn. --- Ter info. Voor mijn blackberry heb ik een app genaamd Diaryline. Deze gebruikt dus SQLite als database. Ik probeer nu vanuit deze database een export te maken, zodat ik mijn notities binnen deze app kan hergebruiken door een andere programma.
Ik probeer voor 14 dagen de trial. Maar ik wil zeker zijn dat ik die data niet kwijt raak als ik geen blackberry meer heb. Ik ben al een heel end op weg. Alleen nog die datum.
Verwijderde gebruiker
13 jaar geleden
Die datum in excel "######" gebeurt volgens mij alleen maar als de kolom te smal staat om de volledige datum weer te geven. Misschien denk ik veel te simpel, maar probeer eens gewoon die kolom breder te maken in Excel? (Of exporteer naar een CSV'tje of zo en kijk wat er dan in komt te staan.)
Verwijderde gebruiker
13 jaar geleden
@sadbur, ja dat is mij bekend en is ook wat ik als eerste had geprobeerd. Helaas.
rose
13 jaar geleden
Probeer het eens met een kolom ernaast invoegen met daarin: =Timestamp / 86400 + 25569 (waarbij Timestamp de waarde in de eerste kolom is)
Verwijderde gebruiker
13 jaar geleden
Bijna.
1303394172 wordt dan 21-04-11 13:56
Maar moet zijn 21-04-2011 15:56 Van het bovenstaande voorbeeld is het dan geworden:
1293893960 1-01-11 14:59
Maar moet zijn 01-01-11 15:59 Hoe ben je achter die omzet formule gekomen?
rose
13 jaar geleden
Het komt hier vandaan: http://excel.tips.net/T002051_Converting_UNIX_DateTime_Stamps.html Als je een kleine correctie uitvoert krijg je de juiste tijd: =(Timestamp+7200)/ 86400 + 25569 7200 is twee uur, je krijgt naar het lijkt GMT uit je APP
Verwijderde gebruiker
13 jaar geleden
Dank je voor de link. Ik vergelijk nu je nieuwe correctie met de datum velden uit de database. Het lijkt erop dat er nog 2 zaken tellen. GMT en zomer-/wintertijd. Beide wordt niet meegenomen in de basis van de time-veld. Toch kan de app zelf die waarde wel goed omzetten. Dus zit ik nu te kijken of ik het niet binnen SQLite kan omzetten ipv via Excell.
Heb jij nog ideeën hiervoor?
Verwijderde gebruiker
13 jaar geleden
Ik heb het inmiddels gevonden via (http://www.sqlite.org/lang_datefunc.html) Het is: SELECT datetime(1092941466, 'unixepoch', 'localtime');
rose
13 jaar geleden
Hoe deed jij je export dan,. GD?
Verwijderde gebruiker
13 jaar geleden
Nu nog een laatste probleem. De kolom labels uit de select statement is eigenlijk ook een tabel (de koppeltabel). Ik zou dus een comma gescheiden resultaat in die kolom willen tonen. Hoe zou ik dat kunnen doen? Kan je een select statement in een select statement kunnen doen. Of op een andere wijze. Dus wat ik nu doe met opzoeken via de 2 left joins. Nu krijg ik echter maar 1 labelnaam in de resultaat. Terwijl sommige records meerdere labels kunnen hebben (gekoppeld).
rose
13 jaar geleden
Het is mij niet helemaal duidelijk. Wil je een aantal velden uit een tabel als 1 kolom?
Verwijderde gebruiker
13 jaar geleden
Een record heeft een veld labels. Deze labels komen uit een referentietabel met een koppeltabel. Dus een record kan gekoppeld zijn met label A en label B.
Nu wil ik met de uitdraai van de record een kolom hebben die voor de records de labels zet. Dus "label A, label B"
rose
13 jaar geleden
Sorry, over je laatste alinea heen gelezen. Wellicht dat ik hier dit weekend even op terug kan komen...
Verwijderde gebruiker
13 jaar geleden
OK
Verwijderde gebruiker
12 jaar geleden
Ik moet helaas de vraag sluiten. Mocht je nog suggestief hebben over het laatste probleem. Dan hoor ik dit graag van je in een PB.
Bedankt tot zo ver!

Andere antwoorden (2)

Select * from table1 inner join table2 on table1.referentie = table2.referentie.
(Lees meer...)
Verwijderde gebruiker
13 jaar geleden
SELECT i.Id, i.naam, i.inhoud, l.labeltekst, p.ItemID, p.LabelID FROM i as items, l as labels, p as ItemLabel WHERE ItemID = LabelID

Je maakt alleen de fout dat je een koppeltabel aanmaakt. Dat hoort normaal niet. Je hebt een id, das het unieke nummer voor het record, en daarnaast heb je dan een referentie id dat in zowel Items als Labels staat. Bijv. een artikelnummer. Dan krijg je dus je tabellen:
Items: id, referentie, naam, inhoud
Labels: id, referentie, labeltekst

En je query:
SELECT i.id, i.naam, i.inhoud, l.id, l.referentie, l.labeltekst FROM i as items, l as labels WHERE i.referentie = l.referentie

Succes ;)
(Lees meer...)
Verwijderde gebruiker
13 jaar geleden
Verwijderde gebruiker
13 jaar geleden
Dank je, ik ben eruit. De database heb ik niet gemaakt. Maar moet ik mee werken.

Weet jij het beter..?

Het is niet mogelijk om je eigen vraag te beantwoorden Je mag slechts 1 keer antwoord geven op een vraag Je hebt vandaag al antwoorden gegeven. Morgen mag je opnieuw maximaal antwoorden geven.

0 / 2500
Gekozen afbeelding