webForumDet fria alternativet

JOIN hit och dit...!

Databaser & SQL

5 svar · 525 visningar · startad av learn

Medlem sedan jan. 20051 130 inlägg
Frågan#1

Jag lägger ihop flera tabeller i en och samma query men tycker det borde gå att förbättra.

Följande fungerar som jag vill

SELECT k.kontoID, a.namn, u.adress
FROM konto k
LEFT JOIN anvandare a ON a.objektID IN
(
	SELECT objektID FROM objekt_konto ok WHERE ok.kontoID = k.kontoID
)
LEFT JOIN uppgifter u ON u.objektID IN
(
	SELECT objektID FROM objekt_konto ok WHERE ok.kontoID = k.kontoID
)

Eftersom båda joinarna spelar mot samma villkor så borde det väl gå att slå ihop på något sätt. Eller?

Följande fungerar ju naturligtvis inte

SELECT k.kontoID, a.namn, u.adress
FROM konto k
LEFT JOIN anvandare a
LEFT JOIN uppgifter u
ON a.objektID AND u.objektID IN
(
	SELECT objektID FROM objekt_konto ok WHERE ok.kontoID = k.kontoID
)

Men kanske med någon justering... Hur kan man göra?

Medlem sedan jan. 20051 130 inlägg
#2

På något sätt borde det väl gå att effektivisera?? Känns så himla onödigt att behöva köra SAMMA subquery flera flera flera gånger:

SELECT k.kontoID, a.namn, u.adress, l.namn, s.namn, g.namn
FROM konto k
LEFT JOIN anvandare a ON a.objektID IN
(
	SELECT objektID FROM objekt_konto ok WHERE ok.kontoID = k.kontoID
)
LEFT JOIN uppgifter u ON u.objektID IN
(
	SELECT objektID FROM objekt_konto ok WHERE ok.kontoID = k.kontoID
)
LEFT JOIN land l ON l.objektID IN
(
	SELECT objektID FROM objekt_konto ok WHERE ok.kontoID = k.kontoID
)
LEFT JOIN stad s ON s.objektID IN
(
	SELECT objektID FROM objekt_konto ok WHERE ok.kontoID = k.kontoID
)
LEFT JOIN gata g ON g.objektID IN
(
	SELECT objektID FROM objekt_konto ok WHERE ok.kontoID = k.kontoID
)

Tabellnamnen är endast exempel.

Hur kan man göra?? Tacksam för hjälp :)

Medlem sedan dec. 20025 483 inlägg
#3
SELECT k.kontoID, a.namn, u.adress, l.namn, s.namn, g.namn
FROM konto k
left join objekt_konto ok on k.kontoid = ok.kontoid
left join anvandare a on a.objektid = ok.objektid
LEFT JOIN uppgifter u ON u.objektID = ok.objektid
LEFT JOIN land l ON l.objektID = ok.objektid
LEFT JOIN stad s ON s.objektID = ok.objektid
LEFT JOIN gata g ON g.objektID = ok.objektid
Medlem sedan jan. 20051 130 inlägg
#4

Tack för ditt svar Peter S men det där går nog inte. Eftersom objekt_konto innehåller flera objektID per kontoID. I ditt exempel hämtas väl bara ut ett objektID där kontoID har ett visst värde.

Varje "undertabell" (anvandare, uppgifter, land, stad, gata) har ett eget unikt objektID. Alltså behöver jag hämta alla objektID som tillhör kontoID från objekt_konto...

Det är därför jag gör en subquery.

Kanske tänker jag fel, men jag tror jag är på rätt spår.

Kan inte joinarna dela på en subquery på något sätt??

Medlem sedan jan. 20051 130 inlägg
#5

Hallå?

Medlem sedan dec. 19995 874 inlägg
#6

Jag är inne på samma spår som peter.
Jag förstår inte riktigt hur din databas ser ut, eller vilket resultat du vill uppnå. I detta fall vore det bra om du kunde posta lite DDL och testdata

Skulle detta fungera?

SELECT k.kontoID, a.namn, u.adress, l.namn, s.namn, g.namn
FROM konto k
INNER JOIN objekt_konto ok ON ok.kontoID = k.kontoID
LEFT JOIN anvandare a ON a.objektID = ok.objektId
LEFT JOIN uppgifter u ON u.objektID = ok.objektId

På något sätt känns det som att det du vill göra är en inner join mot objekt_konto

266 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
131 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)