select met joins

Status
Niet open voor verdere reacties.

aboreas

Gebruiker
Lid geworden
21 dec 2010
Berichten
5
Hallo,

voor named query in mijn data source view in ssas wil ik een query maken bestaande uit het volgende.

member tabel
contact tabel
adres tabel

een member heeft altijd 1 contact maar kan meerdere adressen hebben. het is echter van belang dat ik met de query alleen 1 adres van die member terug krijg. mijn query is als volgt.

[SQL]SELECT contactID, memberID, adresID
FROM Membertable INNER JOIN contacttable on
membertable.contactID = contacttable.contactid
INNER JOIN adrestable.contactid = contacttable.contactid[/SQL]


result:

contactID, memberID,adresID
----1 ------------ 1 ------------a
----1 ------------ 1 ------------b
----1 ------------ 1 ------------c
----2 ------------ 2 ------------d
----2 ------------ 2 ------------e
----3 ------------ 3 ------------f
----3 ------------ 3 ------------g
----3 ------------ 3 ------------c

wat ik er dus eigenlijk uit wil hebben is het volgende:
contactID, memberID,adresID
----1 ------------ 1 ------------a
----2 ------------ 2 ------------d
----3 ------------ 3 ------------f

zodat hij van een contact met meerdere adressen alleen 1 adres laat zien.

ik hoop dat iemand hier een oplossing voor heeft.
 
Je kunt het eens proberen met SELECT DISTINCT(veld), dan krijg je alleen unieke data terug. Als je dat over je member of contact veld haalt zou het moeten werken.

Houd er wel rekening mee dat je waarschijnlijk een random adres terugkrijg en dat misschien niet alle databases het accepteren :P
 
Je kunt het eens proberen met SELECT DISTINCT(veld), dan krijg je alleen unieke data terug. Als je dat over je member of contact veld haalt zou het moeten werken.

Houd er wel rekening mee dat je waarschijnlijk een random adres terugkrijg en dat misschien niet alle databases het accepteren :P

dat werkt helaas niet. volgens mij pakt hij door de joins een dat ze met zijn 3e uniek moeten zijn... en het is voor een sql server db

in ieder geval bedankt voor je input :)
 
hoi Aboreas,

De truc is het gebruiken van een GROUP BY en een MIN waarde van je adres zoals hieronder:

[SQL]
SELECT M.contactID,
M.memberID,
MIN(adresID) as AdresID -- OF MAX(adresID)
FROM Membertable M
INNER JOIN contacttable C ON M.contactID = C.contactid
INNER JOIN adrestable A ON A.contactid = C.contactid
GROUP BY M.contactID,
M.memberID
[/SQL]

Wat wil je trouwens met een tabel met alleen Id's? of ga je straks het fysieke adres ook invullen? gebruik dan ook MIN('expressie' ) (of MAX('expressie')) en laat de waarden uit contacttable en membertable terugkomen in je GROUP BY

Succes,
Mark.
 
Laatst bewerkt:
Hey mark,

bedankt voor je antwoord. dit werkt helaas ook niet omdat
de ID's geen integers zijn maar uniqueidentifiers (bestaande uit een reeks letters en cijfers)

bedankt voor het mee denken :)
 
Aboreas,

Wat je opmerking over integers betreft, je kunt MIN() op elk datatype behalve bit, text, ntext, en image toepassen.
(en niet op sommige speciale datatypes zoals uniqueidentifier, wél op b.v. timestamp)

Het zou ook helpen als je van tevoren meld dat het om Uniqueidentifiers gaat. das altijd makkelijk, dan kun je rekening houden met eventuele type conversies.

In jouw geval zal een CAST van Uniqueidentifier naar NVARCHAR(max. lengte uniqidenitfier kolom) afdoende zijn.

[SQL]
SELECT M.contactID,
M.memberID,
MIN(CAST(adresID AS NVARCHAR(36))) AS AdresID
FROM Membertable M
INNER JOIN contacttable C ON M.contactID = C.contactid
INNER JOIN adrestable A ON A.contactid = C.contactid
GROUP BY M.contactID,
M.memberID
[/SQL]
 
Laatst bewerkt:
Bedankt Mark!

En zal voor volgende keer onthouden de datatypes er bij te zetten :)

en ga zelf nog maar denke hoe belangrijk het is wel adres gepakt word... maar ik heb nu in ieder geval even veel adressen terug als ik leden heb :)

thanks.
 
Nog een opmerking:

Als je database goed in elkaar zit, zou er in de adres tabel wellicht een bit of een andere indicator zitten wat aangeeft welk adres het hoofdadres c.q. adres van toepassing is. (Het zou slecht zijn als dat niet in je database is aangegeven)

In dat geval heb je helemaal geen GROUP BY nodig, maar een WHERE clausule met een bepaling welk adres het hoofdadres is. Als je zelf de database beheert, wil je dit wellicht toevoegen.

Succes in ieder geval!
Mark.
 
Wellicht een wat late reactie, maar ik doe graag ook mijn plasje...

Ik ben het helemaal met Mark xl eens dat die membertabel nogal overbodig lijkt. Sterker, als elk contact altijd 1 member heeft (en elke member altijd bij 1 contact hoort), lijkt het me logisch om 1 tabel te gebruiken voor contact- en member-info, in plaats van twee tabellen en een koppeltabel met die IDs. Maar dat terzijde.

Ik zou het selecteren van 1 adres uit de adrestabel in een subquery doen. Naar mijn mening is dat overzichtelijker en vermoedelijk heeft dat ook een betere performance omdat er slechts op A.contactid gegroepeerd hoeft te worden.

[SQL]
SELECT M.contactID,
M.memberID,
A.AdresID
FROM Membertable M
INNER JOIN contacttable C ON M.contactID = C.contactid
INNER JOIN
(SELECT contactid
, MIN(CAST(adresID AS NVARCHAR(36))) AS AdresID
FROM adrestable
GROUP BY contactid ) A
ON A.contactid = C.contactid
[/SQL]
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan