Frage : Finden verbindet mehrfache Gleiche innen und „Enkelkind“ Aufzeichnungen in t-SQL auch haben

diese 3 Tabellen betrachten:

create Tabelle tblFirstTable
(
FirstTablePK int nicht ungültig,
FirstTableKeyA VARCHAR (2) nicht Null,
FirstTableKeyB VARCHAR (6) nicht Null,
FirstTableAltKeyA VARCHAR (2) nicht Null,
FirstTableAltKeyB VARCHAR (6) nicht Null,
FirstTableAltKeyC VARCHAR (1) nicht Null,
FirstTableAltKeyX VARCHAR (2) nicht Null,
FirstTableAltKeyY VARCHAR (6) nicht Null,
FirstTableAltKeyZ VARCHAR (1) nicht Null,
)

create Tabelle tblSecondTable
(
SecondTablePK int nicht ungültig,
SecondTableKeyA VARCHAR (2) nicht Null,
SecondTableKeyB VARCHAR (6) nicht Null,
SecondTableAltKeyX VARCHAR (2) nicht Null,
SecondTableAltKeyY VARCHAR (6) nicht Null,
SecondTableAltKeyZ VARCHAR (1) nicht Null,
Update_When das DATUM/UHRZEIT nicht ungültig,
Update_By VARCHAR (50) nicht ungültig,
)

create Tabelle tblThirdTable
(
ThirdTablePK int nicht ungültig,
SecondTableFK int nicht ungültig,
AgentName VARCHAR (20) nicht null
) verbinden

The zwischen tblFirstTable und ist on
FirstTableKeyA = SecondTableKeyA tblSecondTable UND FirstTableKeyB =SecondTableKeyB

For jeder von diesen verbindet, für jedes entsprechende Werte von {FirstTableAltKeyX, FirstTableAltKeyY, FirstTableAltKeyZ}
there innen, sein können 1 oder mehr Werte {SecondTableAltKeyX, SecondTableAltKeyY, SecondTableAltKeyZ}. Dieses ist der Schlüssel condition.

I möchte nur Aufzeichnungen von tblFirsttable vorwählen, wenn der oben genannte Schlüsselzustand erfüllt ist und auch, wenn es Kindaufzeichnung für tblSecondTable in tblThirdTable.

Example gibt:
tblFirstTable
1, „AA“, „BBBBBB“, „cm“, „DDDDDD“, „E“, „FF“, „GGGGGG“, „H'< Br/>2, „@@“, „######“, „$$“, „%%%%%%“, „^“, „&&“,“ ****** ', „(„
3, „QQ“, „WWWWWW“, „EE“, „RRRRRR“, „T“, „YY“, „UUUUUU“, „I'< Br/>
tblSecondTable
10, „AA“, „BBBBBB“, „werden II“, „JJJJJJ“, „K“, datetime, John
11, „AA“, „BBBBBB“,“, „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, 'Roger Portes'< Br/>22,15, 'Mike Penguert'< Br/>
*For „AA“, „BBBBBB“ in tblFirstTable, haben wir Aufzeichnungen in tblSecondTable auch, 3 von ihnen. So haben wir mehrfache Gleiche. Dieses ist Kriterien #1. Und eins mindestens von ihnen hat eine Kindaufzeichnung in tblThirdTable. Folglich stellen beide Bedingungen zufrieden und wir möchten die Aufzeichnung in tblFirstTable im query.

*For „@@“ holen, „######“ in tblFirstTable, wir haben Aufzeichnungen in tblSecondTable auch, 2 von ihnen. So haben wir mehrfache Gleiche. Dieses ist Kriterien #1. Aber keine von ihnen haben Kindaufzeichnungen in tblThirdTable; weil zweite Kriterien ausfällt, müssen wir die Reihe von tblFirstTable.

*For „QQ“ nicht holen, „WWWWWW“ in tblFirstTable, wir haben nur ein Gleiches in tblSecondTable (keine Mehrfachverbindungsstellengleichen). Obwohl dieses eine Kindaufzeichnung (zweite Kriterien ist erfüllt), hat, weil die ersten Kriterien nicht erfüllt ist, holen wir nicht die Reihe von tblFirstTable im query.

how würden Sie aufbauen das Resultat, das im Code t-SQL? gewünscht wird.

thank you

Antwort : Finden verbindet mehrfache Gleiche innen und „Enkelkind“ Aufzeichnungen in t-SQL auch haben

Gut sein können einige Strategien, wie Sie von oben genanntem sehen können…

Die zugrunde liegenden Verhältnisse sind using eine Unterseite von entschlossen (wenn wir alle Details) benötigten:

T1.*, T2.*, T3.* vorwählen
von tblFirstTable T1
inner tblSecondTable T2 auf verbinden T1.FirstTableKeyA = T2.SecondTableKeyA UND T1.FirstTableKeyB =T2.SecondTableKeyB
inner tblThirdTable T3 auf verbinden T2.SecondTablePK = T3.SecondTableFK

-- In der Erwägung es PK und FK gibt, annehmen wir passende Index-Bewegung auf denen n.
-- So angemessen, Index-Bewegung auf den TableKeyA und TableKeyB Spalten in ihren jeweiligen Tabellen außerdem anzunehmen.
-- Welches bedeutet, dass wir using relativ glücklich sein können, verbindet.
-- Aber wir nur benötigen wirklich Kostenzähler… Nicht Details…

auserwähltes FirstTablePK als FPK, gelten (secondTablePK) als T2_count, gelten (thirdTablePK) als T3_count  
von tblFirstTable T1
inner tblSecondTable T2 auf verbinden T1.FirstTableKeyA = T2.SecondTableKeyA UND T1.FirstTableKeyB =T2.SecondTableKeyB
inner tblThirdTable T3 auf verbinden T2.SecondTablePK = T3.SecondTableFK
Gruppe durch FirstTablePK
Zählimpuls (secondTablePK) > 1 haben

-- Anmerkung, müssen wir T3_count nicht wirklich zählen, weil die inneren lösen das Bestehen von mindestens 1 Eintrag in tblThirdTable verbinden
-- und wirklich, müssen wir T2_count nicht vorwählen, weil das Haben von Klausel diesen Zählimpuls für uns tut
-- Aber wir tun benötigen Details müssen die tblFirstTable Daten so zurückbekommen.

vorwählen *
von (FirstTablePK als FPK vorwählen  
      von tblFirstTable T1
      inner tblSecondTable T2 auf verbinden T1.FirstTableKeyA = T2.SecondTableKeyA UND T1.FirstTableKeyB =T2.SecondTableKeyB
      inner tblThirdTable T3 auf verbinden T2.SecondTablePK = T3.SecondTableFK
      Gruppe durch FirstTablePK
      Zählimpuls (secondTablePK) > 1) s haben
inner tblFirstTable auf verbinden FPK = FirstTablePK

-- jetzt haben wir einen Subquery für unseren Kostenzähler und vorwählen zurück das tblFirstTable le
-- so wirklich können wir Elemente dieses Subquery heraus aufspalten, also beziehen wir nur auf Tabellen einmal, wenn möglich
-- und weil es ein einfacher Kostenzähler ist, können wir dieses Teil als nur der Subquery wirklich haben.

vorwählen *
von tblFirstTable T1
Wo 1 <�>           vom tblSecondTable T2
           inner tblThirdTable T3 auf verbinden T2.SecondTablePK = T3.SecondTableFK
           wo T1.FirstTableKeyA = T2.SecondTableKeyA UND T1.FirstTableKeyB =T2.SecondTableKeyB)

-- es konnte zusätzliche Weisen zu erforschen, aber zu denken, die die beste Leistung gibt, und die Bedachtsamkeit/die Schritte geben, die verwendet, um an diesen Punkt zu gelangen:)
Weitere Lösungen  
 
programming4us programming4us