Fråga : Den finna multipeln matchar sammanfogar in och också att ha ”barnbarn” rekord i t-SQL

betrakta dessa 3 bordlägger:

create bordlägger tblFirstTable
(
inte ogiltiga FirstTablePK int,
2) inte ogiltiga FirstTableKeyA VARCHAR (,
6) inte ogiltiga FirstTableKeyB VARCHAR (,
2) inte ogiltiga FirstTableAltKeyA VARCHAR (,
6) inte ogiltiga FirstTableAltKeyB VARCHAR (,
1) inte ogiltiga FirstTableAltKeyC VARCHAR (,
2) inte ogiltiga FirstTableAltKeyX VARCHAR (,
6) inte ogiltiga FirstTableAltKeyY VARCHAR (,
1) inte ogiltiga FirstTableAltKeyZ VARCHAR (,
)

create bordlägger tblSecondTable
(
inte ogiltiga SecondTablePK int,
2) inte ogiltiga SecondTableKeyA VARCHAR (,
6) inte ogiltiga SecondTableKeyB VARCHAR (,
2) inte ogiltiga SecondTableAltKeyX VARCHAR (,
6) inte ogiltiga SecondTableAltKeyY VARCHAR (,
1) inte ogiltiga SecondTableAltKeyZ VARCHAR (, inte ogiltig DATETIME för
Update_When,
50) inte ogiltiga Update_By VARCHAR (,

create för
) bordlägger

The för tblThirdTable
(
inte ogiltiga ThirdTablePK int,
inte ogiltiga SecondTableFK int, null
för
AgentName VARCHAR (20) inte) sammanfogar mellan tblFirstTable, och tblSecondTable är on
FirstTableKeyA = SecondTableKeyA, OCH FirstTableKeyB =SecondTableKeyB

For alla av dessa sammanfogar, for varje som motsvarar, värderar av {FirstTableAltKeyX, FirstTableAltKeyY, FirstTableAltKeyZ}
there kan vara 1 eller mer värderar in {SecondTableAltKeyX, SecondTableAltKeyY, SecondTableAltKeyZ}. Denna är den nyckel- skulle något liknande för condition.

I som väljer endast rekord från tblFirsttable, när det ovannämnda nyckel- villkorar är satisfied, och också, om det finns barnrekordet för tblSecondTable i tblThirdTable.

Example:
tblFirstTable
1, ”AA”, ”BBBBBB”, ”CC”, ”DDDDDD”, ”E”, ”FF”, ”GGGGGG”, ”H'
2, ”@@”, ”######”, ”$$”, ”%%%%%%”, ”^”, ”&&”,” ****** ', ”(”
3, ”QQ”, ”WWWWWW”, ”EE”, ”RRRRRR”, ”T”, ”YY”, ”UUUUUU”, ”I'

tblSecondTable
10, ”AA”, ”BBBBBB” ”II”, ”JJJJJJ”, ”K”, datetime, John
11, ”AA”, ”BBBBBB”, ska”, ”MMMMMM”, ”N”, datetime, Mary
12, ”AA”, ”BBBBBB”, ”OO”, ”PPPPPP”, ”Q”, datetime, Joe
13, ”@@”, ”######”,”)),” ”,------” ”=”, datetime, Jim
14, ”@@”, ”######”, ”~~”, ”!!! !!! ” ”; ” datetime, Jack
15, ”QQ”, ”WWWWWW”, ”AA”, ”SSSSSS”, 'D'

tblThirdTable
20,11, 'Miriam Racques'
21,12, 'Roger Portes'
22,15, 'Mike Penguert'

*For ”AA”, ”BBBBBB” i tblFirstTable, vi har rekord i tblSecondTable också, 3 av dem. Så vi har multipelmatcher. Detta är kriterier #1. Och ett åtminstone av dem har ett barnrekord i tblThirdTable. Hence båda villkorar tillfredsställer, och vi skulle något liknande för att komma med rekordet i tblFirstTable i query.
*For ”@@”, ”######” i tblFirstTable, oss har rekord i tblSecondTable också, 2 av dem. Så vi har multipelmatcher. Detta är kriterier #1. Men inga av dem har barnrekord i tblThirdTable; därför att understödja kriteriumkuggningar, vi måste inte att komma med ro från tblFirstTable.

*For ”QQ”, ”WWWWWW” i tblFirstTable, oss har endast en match i tblSecondTable (inga multipelmatcher). (Understödja kriterier är satisfied), även om detta har ett barnrekord, därför att de första kriterierna inte är satisfied, vi ska för att inte komma med ro från tblFirstTable i query.
how skulle dig bygger det önskade resultatet i t-SQL kodifierar?.

thank you
" klar "

Svar : Den finna multipeln matchar sammanfogar in och också att ha ”barnbarn” rekord i t-SQL

Välla fram, kan vara några strategier, som du kan se från ovannämnt…,

De bakomliggande förhållandena lösas using en basera av (om alla vi behövde specificerar):

välj T1.*, T2.*, T3.*
från tblFirstTable T1
inre sammanfoga tblSecondTable T2 på T1.FirstTableKeyA = T2.SecondTableKeyA OCH T1.FirstTableKeyB =T2.SecondTableKeyB
inre sammanfoga tblThirdTable T3 på T2.SecondTablePK = T3.SecondTableFK

-- Considering det finns PK och FKS, vi antar anslår att indexera på de.
-- Så rimligt för att anta att indexera på de TableKeyA och TableKeyB kolonnerna i deras respektive bordlägger som väl.
-- Vilket hjälpmedel, att vi kan vara rimligen lyckliga using sammanfogar.
-- Men vi endast behöver egentligen kontrar…, Inte specificerar…,

valda FirstTablePK som FPK, räkning (secondTablePK) som T2_count, räkning (thirdTablePK) som T3_count  
från tblFirstTable T1
inre sammanfoga tblSecondTable T2 på T1.FirstTableKeyA = T2.SecondTableKeyA OCH T1.FirstTableKeyB =T2.SecondTableKeyB
inre sammanfoga tblThirdTable T3 på T2.SecondTablePK = T3.SecondTableFK
grupp av FirstTablePK
ha räkningen (secondTablePK) > 1

-- Notera oss måste inte att räkna T3_count egentligen, därför att de inre sammanfogar ska beslutsamhet existensen av åtminstone 1 tillträde i tblThirdTable
-- och egentligen, vi måste inte att välja T2_count, därför att ha sats gör den räkning för oss
-- Men vi behöver specificerar, så, måste att få baksida de tblFirstTable datan.

välj *
från (välj FirstTablePK som FPK  
      från tblFirstTable T1
      inre sammanfoga tblSecondTable T2 på T1.FirstTableKeyA = T2.SecondTableKeyA OCH T1.FirstTableKeyB =T2.SecondTableKeyB
      inre sammanfoga tblThirdTable T3 på T2.SecondTablePK = T3.SecondTableFK
      grupp av FirstTablePK
      ha räkningen (secondTablePK) > 1) s
inre sammanfoga tblFirstTable på FPK = FirstTablePK

-- nu vi har en subquery för vårt att kontra och välja tillbaka det tblFirstTable
-- så egentligen vi kan dela ut beståndsdelar av den subquery, så vi ser endast bordlägger en gång om möjligheten
-- och därför att den är ett enkelt, kontra, oss kan faktiskt ha den del som subqueryen endast.

välj *
från tblFirstTable T1
Var 1 <�>           från tblSecondTable T2
           inre sammanfoga tblThirdTable T3 på T2.SecondTablePK = T3.SecondTableFK
           var T1.FirstTableKeyA = T2.SecondTableKeyA OCH T1.FirstTableKeyB =T2.SecondTableKeyB)

-- det kan är extra väg att undersöka, men funderare som ger den bäst kapaciteten, och samtalen/kliver van vid får till det pekar:),
Andra lösningar  
 
programming4us programming4us