webForumDet fria alternativet

JOIN på tabeller och låtsastabeller

Databaser & SQL

4 svar · 190 visningar · startad av m_soderlund

Medlem sedan sep. 20026 425 inlägg
Frågan#1

Jag har två tabeller, tabell orders_62003 och tabell orders_72003. I båda tabellerna har jag bland annat kolumnerna agentname (varchar) och phonenumber (int). För att få reda på hur många ordrar en så kallad agent har registrerat så kör jag en JOIN på samma tabell, och det fungerar ju utmärkt med en tabell.
Nu är det så att jag vill visa info från båda tabellerna, men där går jag bet. Någon form av dubbel JOIN kanske skulle fungera, men jag får inte riktigt till det.

Här är i alla fall kod för hur jag fixar det med en tabell:

SELECT a.agentname,
(SELECT Count(b.phonenumber) FROM orders_62003 b WHERE a.agentname=b.agentname) AS tot
FROM orders_62003 a WHERE a.orderdate BETWEEN '2003-06-12' AND '2003-06-30' GROUP BY agentname ORDER BY tot DESC

En sammanslagning av tabellerna är inte att tänka på - varje tabel l innehåller minst 5000 poster och för varje år blir det ju 60000 poster, vilket är lite jobbigt att leta igenom (även om det är SQL Server..).

Tacksam för hjälp. :D

Medlem sedan dec. 200012 464 inlägg
#2

60000 poster är inget problem bara du har indexerat.

Om du hela tiden skapar nya tabeller så måste du alltid skriva om dina frågor. Dessa frågor blir även onödigt komplexa.

Använd en tabell.

Medlem sedan sep. 20026 425 inlägg
#3

Tack för dina synpunkter, Lars. Jag kommer att ta upp dem (igen) med min arbetsgivare (om att ha en tabell för ett år i stället för tolv för ett år). Dock undrar jag ifall om mitt problem går att lösa om jag använder två tabeller?

Medlem sedan dec. 200012 464 inlägg
#4
SELECT a.agentname,
(SELECT Count(b.phonenumber) FROM orders_62003 b WHERE a.agentname=b.agentname) +
(SELECT Count(b.phonenumber) FROM orders_72003 b WHERE a.agentname=b.agentname) 
AS tot
FROM orders_62003 a WHERE a.orderdate BETWEEN '2003-06-12' AND '2003-06-30' GROUP BY agentname ORDER BY tot DESC
Medlem sedan sep. 20026 425 inlägg
#5

Perfekt Lasse, man tackar! :bire

Slutgiltig kod:

"SELECT distinct Top 20 a.agentname," & _
    "(SELECT Count(b.phonenumber) FROM orders_cd_62003 b WHERE a.agentname=b.agentname AND b.orderdate BETWEEN '2003-06-12' AND '2003-06-30') + " & _
    "(SELECT Count(b.phonenumber) FROM orders_cd_72003 b WHERE a.agentname=b.agentname AND b.orderdate BETWEEN '2003-07-01' AND '2003-07-31') AS tot " & _
    " FROM orders_cd_62003 a GROUP BY agentname,orderdate ORDER BY tot DESC"
257 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)