Welcome to Sign in | Help
in Search

Query

Last post 02-08-2007, 4:44 PM by rsocol. 9 replies.
Sort Posts: Previous Next
  •  02-05-2007, 11:25 AM 1657

    Query

    Buna ziua,

    Mi-e si jena sa pun o astfel de intrebare aici, dar pana la urma o sa o fac.

     Am 3 tabele.

     
    Una de parteneri cu: partenerid(PK), denumire, adrid(FK), divizieid(FK)
    Una de adrese: adrid (PK), orasid(FK), strada, numar, bloc, etc.
    Si una de divizii cu: divizieid(PK), descriere.

     
    Am 5 divizii. Pe fiecare divizie am niste agenti de vanzare (care sunt in alte tabele si nu-si au rostul in intrebarea mea, dar am vrut sa lamuresc situatia).

     Vreau sa vad toti partenerii cu adresele aferente pe 3 din cele 5 divizii, chiar daca pe unele dintre ele nu au nici un agent activ .

          e.g.:  partenerul nr.1 are divid 1 si 2, dar eu vreau sa ii afisez : partener1 adresa div1 agent

                                                                                                    partener1 adresa div2 agent

                                                                                                    partener1 adresa div3 agent (chiar daca nu are agent si/sau divizie alocata in                                                                                                                                               tabela de parteneri)

     

    Am incercat sa fac outer join cu tabela de divizie, dar nu-mi aduce toate diviziile, doar cele ce au id-ul specificat in tabela de parteneri.

     

    Multumesc frumos de ajutor



     

     

     

  •  02-05-2007, 11:32 AM 1658 in reply to 1657

    Re: Query

    Ca prima idee fa un view pe divizii si adrese care sa iti dea div adresa, si pe urma un query partener view asta...
    Eu in sitatii din astea folosesc Access sa vad mai bine astea, rescriu tabele in Access ma joc sa imi fac query si Views si pe urma incerc pe DB "adevarate" SQL obtinute. Am vazut ca si in Visual e acuma ceva aproximativ la fel de user freindly pentru views, dar inca nu am trecut la el 100%... 
  •  02-05-2007, 12:19 PM 1662 in reply to 1658

    Re: Query

    CREATE DATABASE Test1
    GO
    USE test1
    GO
    CREATE TABLE Orase(
     orasid int IDENTITY PRIMARY KEY,
     Denumire nvarchar(20),
    )
    GO
    CREATE TABLE Divizii(
     divizieid int PRIMARY KEY,
     descriere nvarchar(40)
    )
    GO
    CREATE TABLE  Adrese (
     adrid int IDENTITY PRIMARY KEY,
     orasid int FOREIGN KEY REFERENCES Orase(orasid),
     strada nvarchar(20),
     numar varchar(4),
     bloc varchar(4)
    )
    GO
    CREATE TABLE Parteneri (
     partenerid int IDENTITY PRIMARY KEY,
     denumire nvarchar(20),
     adrid int FOREIGN KEY REFERENCES Adrese(adrid),
     divizieid int FOREIGN KEY REFERENCES Divizii(divizieid)
    )
    GO
    INSERT INTO Orase(Denumire) VALUES('Bucuresti')
    INSERT INTO Orase(Denumire) VALUES('Constanta')
    INSERT INTO Orase(Denumire) VALUES('Cluj')
    GO
    INSERT INTO Divizii(Descriere) VALUES('Div1')
    INSERT INTO Divizii(Descriere) VALUES('Div2')
    INSERT INTO Divizii(Descriere) VALUES('Div3')
    INSERT INTO Divizii(Descriere) VALUES('Div4')
    INSERT INTO Divizii(Descriere) VALUES('Div5')
    GO
    INSERT INTO Adrese(orasid, strada, numar, bloc) VALUES (1,'Magheru','2BIS','A1')
    INSERT INTO Adrese(orasid, strada, numar, bloc) VALUES (2,'Unirii','5','A')
    INSERT INTO Adrese(orasid, strada, numar, bloc) VALUES (3,'Stefan Cel Mare','2','V1')
    GO
    INSERT INTO Parteneri(denumire, adrid,divizieid) VALUES ('Ion',3,1)
    INSERT INTO Parteneri(denumire, adrid,divizieid) VALUES ('Ion',3,3)
    INSERT INTO Parteneri(denumire, adrid,divizieid) VALUES ('Grigore',2,2)
    INSERT INTO Parteneri(denumire, adrid,divizieid) VALUES ('Grigore',2,1)
    INSERT INTO Parteneri(denumire, adrid,divizieid) VALUES ('Popescu',4,1)
    GO
    SELECT * FROM adrese
    SELECT * FROM parteneri
    SELECT * FROM divizii
    GO
    SELECT p.denumire, a.strada, a.numar, a.bloc, d.descriere FROM divizii d
    left join parteneri p ON d.divizieid=p.divizieid
    left join adrese a ON p.adrid=a.adrid
    ORDER BY d.divizieid, p.denumire
    GO
    USE TempDB
    GO
    DROP DATABASE Test1

     

     

     

    La asta te-ai referit? daca nu.... eventual pune aici scriptul de creare a tabelelor si pune mai multe detalii despre ce rezultat ai nevoie.


    Cătălin D.
  •  02-05-2007, 12:30 PM 1663 in reply to 1657

    Re: Query

    Tocmai tabela cu agentii lipseste pentru a-mi face o idee de ce inseamna agent activ/inactiv!

    banuiesc ca tabela de agenti se leaga de cea de divizii prin divizieid si ca divizieid nu e specificat pt agentii inactivi;

    in aceasta situatie se apeleaza la left(right) join , depinde cum privesti tabelele.

    Altfel, daca indicatorul de activ/inactiv este un flag se face un view cu where-ul de rigoare prin interfata.

     


    Gheorghe Ciubuc,SQL Server Influencer, MCP(SQL 2000), MCTS (SQL Server 2005) , OCA(Oracle 9i), Sybase(Brainbench)
  •  02-05-2007, 1:51 PM 1667 in reply to 1663

    Re: Query

    O sa mai dau niste informatii, se pare ca m-am grabit si am fost prea succint 

     Acestea sunt tabelele folosite pt query-ul meu

    parteneri p
    locatii l
    adrese a
    orase o
    judete j
    parteneriagenti pa
    clasificaridivizii v
    personal sp
    persoanefizice pf

    select    CodPArtener = p.cod,
            Partener = p.denumire,
            l.Locatie,
            Judet = isnull(j.Nume, ''),
            Oras = isnull(o.Nume, ''),
            Strada = isnull(a.Strada, ''),
            Numar = isnull(a.strada_nr, ''),
            Divizie = isnull(pa.Divizie, ''),
            Agent = isnull(pa.Agent, '')
    from    dbo.parteneri p with(nolock)
            inner join locatii l with(nolock) on l.locatie_id = p.locatieid
            inner join adrese a with(nolock) on a.adresa_id = p.adresa_principala_id
            inner join orase o with(nolock) on o.oras_id = a.oras_id
            inner join judete j with(nolock) on j.judet_id = o.judet_id
            left join (
                    Select     pa.fkpartener, descriere as Divizie, pf.Nume as Agent
                     from ParteneriAgenti dpa with(nolock)
                            inner join clasificaridivizii v with(nolock) on v.PK_CLASIFICARI_VALORI = pa.divizieid
                            inner join Personal pers with(nolock) on pa.FkAngajat = pers.Angajat_Id
                            inner join PersoaneFizice pf with(nolock) on pers.Persoane_Fizice_Id = pf.Persoane_Fizice_Id
                )pa on pa.fkpartener = p.partener_id

     Acela era query-ul meu.

     

    Parteneriagenti tine si id-ul de divizie cat si cel de agent.

     Stiu ca-mi scapa ceva banal undeva, dar nu pot sa localizez exact buba. M-am gandit sa fac si un UNION cu tabela de divizii sa iau restul, dar nu cred ca e asta solutia.
     

     Edit: am corectat aliasurile

     

  •  02-05-2007, 1:55 PM 1668 in reply to 1667

    Re: Query

    In primul rand, atentie la alias-urile tabelelor, vad ca "locatii" este declarat "sl" dar e folosit "l" ....

    Gheorghe Ciubuc,SQL Server Influencer, MCP(SQL 2000), MCTS (SQL Server 2005) , OCA(Oracle 9i), Sybase(Brainbench)
  •  02-05-2007, 2:29 PM 1674 in reply to 1657

    Re: Query

    http://www.aspfaq.com/etiquette.asp?id=5006
  •  02-05-2007, 2:44 PM 1677 in reply to 1668

    Re: Query

    aliasurile sunt bune, le-am schimbat eu numele sa nu fie exact ca cele din baza.

    Se poate sa-mi fi mai scapat un alias gresit, dar va asigur ca query-ul functioneaza, rezultatul nu este cel scontat.


  •  02-06-2007, 8:40 AM 1709 in reply to 1668

    Re: Query

    daca tot nu am fost destul de clar spuneti-mi si o sa incerc sa explic si mai in detaliu.
  •  02-08-2007, 4:44 PM 1750 in reply to 1657

    Re: Query

    Care e tabela cu divizii ? Altfel spus, care e prefixul pentru "descriere" ? Există vreo coloana în tabela cu divizii care să fie foreign key spre parteneri.parteneri_id ? Dacă da, cum se numeşte ? Dacă nu, asta înseamna că nu poate exista o divizie fără sa aiba alocat un agent ?

    Care din urmatoarele coloane permite NULL-uri şi care sunt "required": p.locatie_id, p.adresa_principala_id, a.oras_id, o.judet_id, v.PK_CLASIFICARI_VALORI, pa.FkAngajat, pers.Persoane_Fizice_Id ?

    Dacă vreuna din coloanele care ar fi trebuit sa fie "required" permite totuşi NULL-uri, verifică să nu existe niciun NULL şi modifică-le să nu mai permită NULL-uri.

    Există foreign key-uri pentru toate coloanele pe care ai făcut JOIN ?

    Răzvan

    PS. Dacă ai fi postat DDL şi sample data, aşa cum am menţionat mai sus, puteam să aflu singur răspunsurile la întrebarile pe care le-am scris.

View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems