Avatar billede 3z Nybegynder
11. december 2007 - 15:53 Der er 9 kommentarer

Inner Join Problem igen

Synes sgu jeg kager lidt rundt i det Inner Join halløj:

Jeg skal bruge følgende data:

Tabel: Clients
Felter: ID, Name

Tabel: Orders
Felter: ID, OrderNo, CustomerID, Orderdate, Total

Tabel: CreditNotes
Felter: ID, CreditnoteNo, CustomerID, Total

Jeg vil nu finde de Orders og CreditNotes som hænger sammen med hver Client, hvor CustomerID svarer til ID i Clients tabellen. Der skal kun hentes Orders ud where OrderStatus = 'Invoiced' og CreditNotes ud where CreditnoteStatus = 'OK'.

Jeg kan bare ikke få ID ud af Clients tabellen og en masse andet bøvl, så nu har jeg slettet alt og beder jeg kloge hoveder om hjælp :(
Avatar billede softspot Forsker
11. december 2007 - 16:54 #1
Nu er der godt nok ikke vist hvilke tabeller OrderStatus og CreditnoreStatus ligger, men jeg har gættet på at de ligger i hhv. Orders og CreditNotes. I så fald ville jeg forsøge med denne SQL:

SELECT c.*, o.*, cn.*
FROM (clients c
INNER JOIN orders o ON o.CustomerID = c.id)
INNER JOIN creditnotes cn ON cn.CustomerID = c.id
WHERE o.OrderStatus = 'Invoiced'
AND cn.CreditnoteStatus = 'OK'
Avatar billede softspot Forsker
11. december 2007 - 16:55 #2
Det kan da godt være du skal være mere specifik mht. navngivning af kolonnerne i resultatet, da der er flere forskellige udgaver af ID og CustomerID. Alternativt kun udvælge specifikke kolonner fra de forskellige tabeller...
Avatar billede 3z Nybegynder
11. december 2007 - 17:06 #3
Ja så langt så godt, men hvordan udskriver jeg så f.eks. Clients ID ?
Hvis jeg bare skriver rs("ID") så får jeg:
Item cannot be found in the collection corresponding to the requested name or ordinal.
Avatar billede 3z Nybegynder
11. december 2007 - 17:22 #4
Hmm kan sgu ikke helt gennemskue what to do.
Jeg skal jo bruge en liste, som kun henter de Clients ud, hvor der er en Ordre og så liste alle Ordrer og CreditNotes udfor hver kunde...
Avatar billede jansangill Nybegynder
11. december 2007 - 22:04 #5
Hvis du har samme navngivning og alle skal være inkluderet i din sql, og du vil have fat i disse ved at kalde på dem, så bliver du vel også nødt til at give de forskellige id'er et alias.

Hvis man går ud fra den her:

SELECT c.*, o.*, cn.*
FROM (clients c
INNER JOIN orders o ON o.CustomerID = c.id)
INNER JOIN creditnotes cn ON cn.CustomerID = c.id
WHERE o.OrderStatus = 'Invoiced'
AND cn.CreditnoteStatus = 'OK'

så:

SELECT c.ID AS cid,c.name,o.ID AS oid, o.*,cn.ID AS cnid, cn.*
FROM ....

Enten skal du omdøbe dine felter i db så de ikke har samme navngivning over det hele, ellers bliver du jo vel nødt til at lave en helvedes lang alias liste i din select.
Avatar billede 3z Nybegynder
12. december 2007 - 00:05 #6
Den med at udskrive felterne er klaret - det var faktisk ikke så svært:
Hvis navnet på feltet kun findes i én tabel, så bruges rs("feltnavn").
Hvis navnet på feltet er lig med et feltnavn i en anden tabel, så bruges rs("tabel.feltnavn")
Avatar billede 3z Nybegynder
12. december 2007 - 00:07 #7
Jeg har dog større udfordringer med, at finde ud af hvordan jeg bruger denne Inner Join SQL sætning.

Jeg skal have genereret en liste med Clients, hvorunder alle Orders og CreditNotes fremgår. Noget á la:
Client1
- Order1
- Order3
- Creditnote1

Client2
- Order2
- Order4

Client3
- Order5
- Creditnote2

osv. - but how ? :)
Avatar billede jansangill Nybegynder
12. december 2007 - 08:17 #8
sql="SELECT c.*, o.*, cn.* FROM Clients,Orders,CreditNotes WHERE Clients.ID = CustomerID AND Clients.ID = CreditNotes.CustomerID"
set rs=Conn.execute(sql)

do while not rs.eof
  response.write rs("name") & "<br />" & rs("Orders.OrderNo") & "<br />" & rs("CreditNotes.CreditnoteNo")
rs.movenext
loop


Hvad skriver den ud hvis du gør således?
Avatar billede jansangill Nybegynder
12. december 2007 - 08:18 #9
ups, mente self "SELECT * FROM Clients,Orders,CreditNotes"
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester