Vraag : Het vinden van veelvoudige gelijken treden en ook het hebben van „kleinkind“ verslagen in t-SQL toe

bespreek deze 3 lijsten:

create- lijst tblFirstTable
(
niet ongeldige FirstTablePK int.,
FirstTableKeyA VARCHAR (2),
FirstTableKeyB VARCHAR (6) niet nietig verklaren niet nietig verklaren,
FirstTableAltKeyA VARCHAR (2) niet nietig verklaren,
FirstTableAltKeyB VARCHAR (6) niet nietig verklaren,
FirstTableAltKeyC VARCHAR (1) niet nietig verklaren,
FirstTableAltKeyX VARCHAR (2) niet nietig verklaren,
FirstTableAltKeyY VARCHAR (6) niet nietig verklaren,
FirstTableAltKeyZ VARCHAR (1) niet nietig verklaren,
)

create- lijst tblSecondTable
(
niet ongeldige SecondTablePK int.,
SecondTableKeyA VARCHAR (2) niet verklaart nietig, treden
6) niet ongeldige SecondTableKeyB VARCHAR (,
2) niet ongeldige SecondTableAltKeyX VARCHAR (,
6) niet ongeldige SecondTableAltKeyY VARCHAR (,
1) niet ongeldige SecondTableAltKeyZ VARCHAR (, niet ongeldig
Update_When DATETIME,
50) niet ongeldige Update_By VARCHAR (,
)

create- lijst tblThirdTable
(
niet ongeldige ThirdTablePK int.,
niet ongeldige SecondTableFK int.,
AgentName VARCHAR (20) niet null
)

The tussen tblFirstTable toe en tblSecondTable zijn on
FirstTableKeyA = SecondTableKeyA EN FirstTableKeyB =SecondTableKeyB

For iedereen hiervan zich aansluit bij, voor elke het corresponderen taxeert van {FirstTableAltKeyX, FirstTableAltKeyY, FirstTableAltKeyZ}
there binnen 1 of meer waarden zijn {SecondTableAltKeyX, SecondTableAltKeyY, SecondTableAltKeyZ}. Dit is belangrijkste condition.

I zou willen slechts verslagen van tblFirsttable selecteren wanneer de bovengenoemde belangrijkste voorwaarde en ook wordt voldaan aan als er kindverslag voor tblSecondTable in tblThirdTable.

Example is:
tblFirstTable
1, „aa“, „BBBBBB“, „CC“, „DDDDDD“, „E“, „FF“, „GGGGGG“, „H'< br/>2, „@@“, „######“, „$$“, „%%%%%%“, „^“, „&&“,“ ****** ', „(„
3, „QQ“, „WWWWWW“, „EE“, „RRRRRR“, „T“, „YY“, „UUUUUU“, „I'< br/>
tblSecondTable
10, „aa“, „BBBBBB“, „II“, „JJJJJJ“, „K“, datetime, John
11, „aa“, „BBBBBB“, zal“, „MMMMMM“, „N“, datetime, Mary
12, „aa“, „BBBBBB“, „OO“, „PPPPPP“, „Q“, datetime, Joe
13, „@@“, „######“,“))“, „------“, „=“, datetime, Jim
14, „@@“, „######“, „~~“, „!!! !!! “, „; “, datetime, Jack
15, „QQ“, „WWWWWW“, „aa“, „SSSSSS“, 'D'< br/>
tblThirdTable
20,11, 'Miriam Racques'< br/>21,12, 'br/>22,15 van Roger Portes'<, br/>
*For „aa“ 'van Mike Penguert'<, „BBBBBB“ in tblFirstTable, hebben wij verslagen ook in tblSecondTable, 3 van hen. Zo hebben wij veelvoudige gelijken. Dit is criteria #1. En minstens één van hen heeft een kindverslag in tblThirdTable. Vandaar stellen beide voorwaarden tevreden, en wij zouden het verslag in tblFirstTable in query.

*For „@@“ willen brengen, „######“ in tblFirstTable, hebben wij verslagen ook in tblSecondTable, 2 van hen. Zo hebben wij veelvoudige gelijken. Dit is criteria #1. Maar geen van hen heeft kindverslagen in tblThirdTable; omdat de tweede criteria ontbreekt, moeten wij niet de rij van tblFirstTable.

*For „QQ“ brengen, „WWWWWW“ in tblFirstTable, hebben wij slechts één gelijke in tblSecondTable (geen veelvoudige gelijken). Alhoewel dit een kindverslag heeft (de tweede criteria is voldaan aan), omdat de eerste criteria niet voldaan die is, wij niet de rij van tblFirstTable in query.

how u zouden bouwen het resultaat brengen zullen in code t-SQL wordt gewenst?.

thank you

Antwoord : Het vinden van veelvoudige gelijken treden en ook het hebben van „kleinkind“ verslagen in t-SQL toe

Goed, kan een paar strategieën zijn aangezien u van bovengenoemd kunt zien…

De onderliggende verhoudingen worden opgelost gebruikend een basis van (als wij alle details) nodig hadden:

selecteer T1.*, T2.*, T3.*
van tblFirstTable T1
binnen sluit me aan bij tblSecondTable T2 op T1.FirstTableKeyA = T2.SecondTableKeyA EN T1.FirstTableKeyB =T2.SecondTableKeyB
binnen sluit aan bij tblThirdTable T3 me op T2.SecondTablePK = T3.SecondTableFK

-- Het nadenken zijn er PK en fk's wij veronderstelt het aangewezen indexeren op die.
-- Zo, redelijk om eveneens het indexeren op de kolommen TableKeyA en TableKeyB in hun respectieve lijsten te veronderstellen.
-- Welk middel dat wij redelijk het gelukkige gebruiken kunnen zijn toetreedt.
-- Maar wij hebben slechts werkelijk tellers nodig… Niet details…

selecteer FirstTablePK aangezien FPK, (secondTablePK) als T2_count telt, (thirdTablePK) als T3_count telt  
van tblFirstTable T1
binnen sluit me aan bij tblSecondTable T2 op T1.FirstTableKeyA = T2.SecondTableKeyA EN T1.FirstTableKeyB =T2.SecondTableKeyB
binnen sluit aan bij tblThirdTable T3 me op T2.SecondTablePK = T3.SecondTableFK
groep door FirstTablePK
hebbend telling (secondTablePK) > 1

-- Nota, moeten wij geen T3_count tellen werkelijk, omdat binnen zal oplossen het bestaan van minstens 1 ingang in tblThirdTable toetreedt
-- en werkelijk, moeten wij geen T2_count selecteren omdat het Hebben van clausule die telling voor ons doet
-- Maar wij hebben details nodig, zodat de tblFirstTable gegevens moeten terugkrijgen.

selecteer *
van (uitgezochte FirstTablePK als FPK  
      van tblFirstTable T1
      binnen sluit me aan bij tblSecondTable T2 op T1.FirstTableKeyA = T2.SecondTableKeyA EN T1.FirstTableKeyB =T2.SecondTableKeyB
      binnen sluit aan bij tblThirdTable T3 me op T2.SecondTablePK = T3.SecondTableFK
      groep door FirstTablePK
      hebbend telling (secondTablePK) > 1) s
binnen sluit me aan bij tblFirstTable op FPK = FirstTablePK

-- nu, hebben wij subquery voor onze teller en selecteren terug tblFirstTable
-- zo, werkelijk kunnen wij elementen van dat subquery uit verdelen zodat verwijzen wij slechts eens naar lijsten indien mogelijk
-- en omdat het een eenvoudige teller is, kunnen wij dat deel als slechts subquery eigenlijk hebben.

selecteer *
van tblFirstTable T1
Waar 1 <�>           van tblSecondTable T2
           binnen sluit aan bij tblThirdTable T3 me op T2.SecondTablePK = T3.SecondTableFK
           waar T1.FirstTableKeyA = T2.SecondTableKeyA EN T1.FirstTableKeyB =T2.SecondTableKeyB)

-- er zou extra manieren kunnen zijn te onderzoeken, maar denkt dat de beste die prestaties, en de discussies geeft/de stappen worden gebruikt om aan dat punt te krijgen:)
Andere oplossingen  
 
programming4us programming4us