Welcome to Sign in | Help
in Search

Cum fac aceasta interogare?

Last post 05-06-2008, 9:50 AM by ThePuiu. 8 replies.
Sort Posts: Previous Next
  •  04-25-2008, 6:23 PM 4757

    Cum fac aceasta interogare?

    Am 2 tabele:

    CREATE TABLE [dbo].[SOLDURI_INITIALE](
    [CONT] [nvarchar](50) NOT NULL,
    [AN] [smallint] NOT NULL,
    [SOLD_DEBITOR] [money] NOT NULL,
    [SOLD_CREDITOR] [money] NOT NULL
    )
    ON [PRIMARY]

    si

    CREATE TABLE [dbo].[PLAN_CONTURI](
    [ID] [decimal](18, 0) IDENTITY(1,1) NOT NULL,
    [CONT] [nvarchar](50) NULL,
    [DENUMIRE] [nvarchar](255) NULL,
    [FUNCTIE] [char](1) NULL
    )
    ON [PRIMARY]

    dupa cum le spune si numele, in PLAN_CONTURI exista toate conturile iar in SOLDURI_INITIALE exista doar conturile care au sold pt fiecare an in parte (soldurile la sfirsitul anului fiscal). Eu vreau sa fac o interogare care sa-mi returneze toate inregistrarile din PLAN_CONTURI plus valoarea SOLD_DEBITOR,SOLD_CREDITOR (acolo unde sint, in rest 0) pentru un anumit an. Ex:

    5311,'Casa in RON',0,0
    5314,'Casa in EUR',200,0
    etc, in acest exemplu, pt contul 5314 exista in SOLDURI_INITIALE un record: 5314,2007,200,0. Pt 5311 in schimb nu exista inregistrare pt anul 2007

    Multumesc anticipat!

  •  04-25-2008, 6:49 PM 4758 in reply to 4757

    Re: Cum fac aceasta interogare?

    singura rezolvare pe care am gasit-o (babeasca zic eu!) este asta:

    select cont,denumire,(select sold_creditor from solduri_initiale where plan_conturi.cont=solduri_initiale.cont and an=2007) ,(select sold_debitor from solduri_initiale where plan_conturi.cont=solduri_initiale.cont and an=2007) from plan_conturi

    se poate si mai elegant?

  •  04-25-2008, 11:49 PM 4759 in reply to 4757

    Re: Cum fac aceasta interogare?

    Incearca si un "left join" intre "conturi" si "solduri".

    * Pentru campul "id" din PLAN_CONTURI e mai nimerit tipul de date "int".

    * In SOLDURI_INITIALE ar mai trebui un "id" - "foreign key" din PLAN_CONTURI.

  •  04-29-2008, 12:15 PM 4762 in reply to 4758

    Re: Cum fac aceasta interogare?

    Da, se poate mai elegant:

    SELECT cont, denumire, sold_debitor, sold_creditor
    FROM plan_conturi p LEFT JOIN solduri_initiale s ON p.cont=s.cont AND s.an=2007

    Ideea e să pui condiţia "an=2007" în clauza ON, nu în clauza WHERE, pentru că dacă o pui în WHERE atunci e ca şi cum ar fi INNER JOIN (deoarece clauza WHERE e evaluată după join, iar NULL-urile nu satisfac condiţia).

    Răzvan
  •  04-29-2008, 5:18 PM 4770 in reply to 4762

    Re: Cum fac aceasta interogare?

    rsocol:
    ... clauza WHERE e evaluată după join...

    Ceva referinţe ai pentru această afirmaţie ?!

  •  04-29-2008, 5:48 PM 4771 in reply to 4770

    Re: Cum fac aceasta interogare?

    Când am scris "clauza WHERE e evaluată după JOIN" am vrut să spun că e evaluată dpdv logic (sau conceptual). Query optimizer-ul poate rearanja ordinea operaţiilor dacă crede că e mai rapid să le evalueze în altă ordine (atâta timp cât rezultatul e acelaşi).

    Referinţe:
    http://tinman.cs.gsu.edu/~raj/sql/node22.html
    http://databases.aspfaq.com/database/how-do-i-use-a-select-list-alias-in-the-where-or-group-by-clause.html
    (partea cu "Joe Celko says...")

    Răzvan
  •  05-02-2008, 6:08 PM 4780 in reply to 4762

    Re: Cum fac aceasta interogare?

    rsocol:
    Da, se poate mai elegant:

    SELECT cont, denumire, sold_debitor, sold_creditor
    FROM plan_conturi p LEFT JOIN solduri_initiale s ON p.cont=s.cont AND s.an=2007

    Ideea e să pui condiţia "an=2007" în clauza ON, nu în clauza WHERE, pentru că dacă o pui în WHERE atunci e ca şi cum ar fi INNER JOIN (deoarece clauza WHERE e evaluată după join, iar NULL-urile nu satisfac condiţia).

    Răzvan


    Nu e acelasi lucru cu :

    SELECT cont, denumire, sold_debitor, sold_creditor
    FROM plan_conturi p LEFT JOIN
    ( select <ce coloane trebuie > from solduri_initiale  where an = 2007 )  s

    ON
    p.cont=s.cont

    Dpdbv estetic, nu imi place o clauza din join care nu are legatura cu amindoua tabelele de join ...



    Ignat Andrei
    http://serviciipeweb.ro/iafblog
  •  05-06-2008, 8:07 AM 4804 in reply to 4780

    Re: Cum fac aceasta interogare?

    Într-adevăr, e acelaşi lucru.

    Răzvan
  •  05-06-2008, 9:50 AM 4806 in reply to 4804

    Re: Cum fac aceasta interogare?

    multumesc tuturor pt ajutorul oferit!

    Puiu

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