Pergunta : Encontrando os fósforos múltiplos juntam-se dentro e igualmente ter registros do “neto” no t-SQL

considerar estas 3 tabelas: tblSecondTable
da tabela do

create do tblFirstTable
da tabela do

create (
FirstTablePK int nao nulo,
FirstTableKeyA VARCHAR (2) nao nulos,
FirstTableKeyB VARCHAR (6) nao nulos,
FirstTableAltKeyA VARCHAR (2) nao nulos,
FirstTableAltKeyB VARCHAR (6) nao nulos,
FirstTableAltKeyC VARCHAR (1) nao nulo,
FirstTableAltKeyX VARCHAR (2) nao nulos,
FirstTableAltKeyY VARCHAR (6) nao nulos,
FirstTableAltKeyZ VARCHAR (1) nao nulo,
) (
SecondTablePK int nao nulo,
SecondTableKeyA VARCHAR (2) nao nulos, o
SecondTableKeyB VARCHAR (6) nao nulos, o
SecondTableAltKeyX VARCHAR (2) nao nulos, o
SecondTableAltKeyY VARCHAR (6) nao nulos, o
SecondTableAltKeyZ VARCHAR (1) nao nulo, o DATETIME do
Update_When nao nulo, o
Update_By VARCHAR (50) nao nulos, o

The do tblThirdTable
da tabela do

create do
) (
ThirdTablePK int nao nulo,
SecondTableFK int nao nulo, null
do
AgentName VARCHAR (20) não) juntam-se entre tblFirstTable e tblSecondTable é o on
FirstTableKeyA = SecondTableKeyA E o =SecondTableKeyB

For de FirstTableKeyB todos destes junta-se, para o cada valores correspondentes {FirstTableAltKeyX, FirstTableAltKeyY, FirstTableAltKeyZ} do
there pode ser 1 ou mais valor dentro {SecondTableAltKeyX, SecondTableAltKeyY, SecondTableAltKeyZ}. Esta é a chave condition.

I gostaria de selecionar somente registros de tblFirsttable quando a condição chave acima é satisfied e também se há um registro da criança para tblSecondTable em tblThirdTable.

Example:
tblFirstTable
1, “AA”, “BBBBBB”, “centímetro cúbico”, “DDDDDD”, “E”, “FF”, “GGGGGG”, do “Br/>2 H'<, “@@”, “######”, “$$”, “%%%%%%”, “^”, “&&”,” ', do ****** “(“
3, “QQ”, “WWWWWW”, “EE”, “RRRRRR”, “T”, “YY”, “UUUUUU”, do “Br/>
tblSecondTable
10 I'<, “AA”, “BBBBBB”, “II”, “JJJJJJ”, “K”, datetime, John
11, “AA”, “BBBBBB”,”, “MMMMMM”, “N”, datetime, Mary
12, “AA”, “BBBBBB”, “OO”, “PPPPPP”, “Q”, datetime, Joe
13, “@@”, “######”, "))”, “------”, “=”, datetime, Jim
14, “@@”, “######”, “~~”, “!!! !!! ”, “; ”, o datetime, Jack
15, “QQ”, “WWWWWW”, “AA”, “SSSSSS”, 'o Br/>
tblThirdTable
20,11 do D'<, 'o Br/>21,12 do Racques'< de Miriam, 'o Br/>22,15 do Portes'< de Roger, 'o Br/>
*For “AA” do Penguert'< de Mike, “BBBBBB” em tblFirstTable, nós temos registros em tblSecondTable igualmente, 3 dele. Assim nós temos fósforos múltiplos. Este é os critérios #1. E pelo menos um deles tem um registro da criança em tblThirdTable. Daqui ambas as circunstâncias satisfazem, e nós gostaríamos de trazer o registro em tblFirstTable no query.

*For “@@”, “######” em tblFirstTable, nós temos registros em tblSecondTable igualmente, 2 dele. Assim nós temos fósforos múltiplos. Este é os critérios #1. Mas nenhuns deles têm registros da criança em tblThirdTable; porque os segundos critérios falham, nós não temos que trazer a fileira de tblFirstTable.

*For “QQ”, “WWWWWW” em tblFirstTable, nós temos somente um fósforo em tblSecondTable (nenhuns fósforos do múltiplo). Mesmo que isto tenha um registro da criança (os segundos critérios são satisfied), porque os primeiros critérios não são satisfied, nós não traremos a fileira de tblFirstTable no query.

how você construiríamos o resultado desejado no código t-SQL?.

thank you
class= do

Resposta : Encontrando os fósforos múltiplos juntam-se dentro e igualmente ter registros do “neto” no t-SQL

Bem, podem ser algumas estratégias como você pode ver de acima…

Os relacionamentos subjacentes são resolved using uma base de (se nós necessários todos os detalhes):

selecionar T1.*, T2.*, T3.*
do T1 tblFirstTable
interno juntar-se ao T2 tblSecondTable em T1.FirstTableKeyA = T2.SecondTableKeyA E T1.FirstTableKeyB =T2.SecondTableKeyB
interno juntar-se ao T3 tblThirdTable em T2.SecondTablePK = T3.SecondTableFK

-- Considerando que há PK e FK nós supor o índice apropriado naqueles.
-- Assim, razoável para supr também o índice nas colunas de TableKeyA e de TableKeyB em suas tabelas respetivas.
-- Qual significa que nós podemos estar razoavelmente felizes using junta-se.
-- Mas nós somente precisamos realmente contadores… Não detalhes…

FirstTablePK seleto como FPK, contagem (secondTablePK) como T2_count, contagem (thirdTablePK) como T3_count  
do T1 tblFirstTable
interno juntar-se ao T2 tblSecondTable em T1.FirstTableKeyA = T2.SecondTableKeyA E T1.FirstTableKeyB =T2.SecondTableKeyB
interno juntar-se ao T3 tblThirdTable em T2.SecondTablePK = T3.SecondTableFK
grupo por FirstTablePK
tendo a contagem (secondTablePK) > 1

-- Nota, nós não temos que contar T3_count realmente, porque o internos se juntam resolverão a existência pelo menos de 1 entrada em tblThirdTable
-- e realmente, nós não temos que selecionar T2_count porque ter a cláusula faz essa contagem para nós
-- Mas nós fazemos precisamos detalhes, assim, temos que receber de volta os dados tblFirstTable.

selecionar *
de (selecionar FirstTablePK como FPK  
      do T1 tblFirstTable
      interno juntar-se ao T2 tblSecondTable em T1.FirstTableKeyA = T2.SecondTableKeyA E T1.FirstTableKeyB =T2.SecondTableKeyB
      interno juntar-se ao T3 tblThirdTable em T2.SecondTablePK = T3.SecondTableFK
      grupo por FirstTablePK
      tendo a contagem (secondTablePK) > 1) s
interno juntar-se a tblFirstTable em FPK = FirstTablePK

-- agora, nós temos um subquery para nosso contador e selecionamos para trás o tblFirstTable
-- Assim, realmente nós podemos rachar para fora elementos desse subquery assim que nós referimos somente tabelas uma vez se possível
-- e porque é um contador simples, nós podemos realmente ter essa parte como o subquery somente.

selecionar *
do T1 tblFirstTable
Onde 1 <�>           do T2 tblSecondTable
           interno juntar-se ao T3 tblThirdTable em T2.SecondTablePK = T3.SecondTableFK
           onde T1.FirstTableKeyA = T2.SecondTableKeyA E T1.FirstTableKeyB =T2.SecondTableKeyB)

-- pôde haver umas maneiras adicionais de explorar, mas pensar que dá o melhor desempenho, e as deliberações/etapas usadas para começ a esse ponto:)
Outras soluções  
 
programming4us programming4us