Avatar billede jmp.dk Nybegynder
06. december 2005 - 10:05 Der er 6 kommentarer og
1 løsning

Sql query - Join

Jeg har to tabeller Customer & Task:

Customer         Task
======================    ==========================
ID    Name        Date        Text    Customer_id
----    --------------    --------    -----    ---------   
1    Test1        18/12/2005    Task1    1
2    Test2        21/12/2005    Task2    1
3    Cutom1        17/12/2005    Task    2

Det jeg skal bruge er kunde navn og naeste opgave.
I nuvaerende version henter jeg fra en table af gangen og slaar naeste aftale op.
Der er performance problemer med det da der er ret mange records i de to tabeller.
Skal bruge en join der giver mig foelgende resultat.

ID    Name    Next task    Text
-----------------------------------------------------------------
1    Test1    18/12/2005    Task1
2    Test2    17/12/2005    Task2
3    Custom1   
=================================================
Alle de joins jeg har proevet giver mig 4 raekker da customer_id = 1 er to gange.
Avatar billede jmp.dk Nybegynder
06. december 2005 - 10:07 #1
Saetter lige tabellerne ind igen saa de er mere laeselige:
Customer            
======================   
ID    Name       
----    --------------   
1    Test1       
2    Test2       
3    Cutom1   
======================
   
Task
==========================================
Date        Text    Customer_id
--------    -----    ---------   
18/12/2005    Task1    1
21/12/2005    Task2    1
17/12/2005    Task    2
===========================================
Avatar billede dr_chaos Nybegynder
06. december 2005 - 10:09 #2
prøv med
SELECT DISTINCT(C.ID),Name,Date,Text FROM Customer C INNER JOIN Task T ON T.Customer_id = C.ID
Avatar billede dr_chaos Nybegynder
06. december 2005 - 10:15 #3
den sql henter de brugere osv. ud der har en task tilknyttet.
Avatar billede lorentsnv Nybegynder
06. december 2005 - 10:24 #4
Denne sql henter den førstkommende task på hver kunde

Select *,
    (select top 1 Date from Task where customer_id = Customer.id and date >= getdate() order by date asc) as date,
    (select top 1 Text from Task where customer_id = Customer.id and date >= getdate() order by date asc) as Text
from Customer
Avatar billede lorentsnv Nybegynder
06. december 2005 - 10:42 #5
Jeg vil tro nedenstående SQL er noget mere effektiv.

Select c.*, T1.Date, T1.Text
from Customer C left join
    (Select T.Customer_ID, T.Date, T.Text
    from Task T inner join
        (Select Customer_ID, min(Date) as date from Task where date >= getdate() group by Customer_ID) as T2
        on T.Customer_ID = T2.Customer_ID and T.Date = T2.Date) as T1
    on C.ID = T1.Customer_ID
Avatar billede jmp.dk Nybegynder
06. december 2005 - 11:02 #6
Jeps det er perfekt det det Lorentsnv, du faar alle point, sorry dr Chaos.
Send et svar lorentsnv.
Avatar billede lorentsnv Nybegynder
06. december 2005 - 11:05 #7
Her er et svar :-)
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
Computerworld tilbyder specialiserede kurser i database-management

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