0

このクエリ:

select distinct a.id, a.caminho, c.indexObr, d.id, d.tamanho, d.mask, d.idName
from gedaidb.dbo.sistema_Documentos as a
join gedaidb.dbo.sistema_DocType as b on a.idDocType = b.id
join gedaidb.dbo.sistema_DocType_Index as c on b.id = c.docTypeId
join gedaidb.dbo.sistema_Indexes as d on c.indexId = d.id
join gedaidb.dbo.sistema_Indexacao as e on a.id = e.idDocumento
where a.id = 97

この結果セットを返します:

id  caminho                                                     indexObr    id  tamanho    mask     idName
97  C:\Users\Guilherme\Desktop\Guilherme\Tipo 3\SkypeSetup.exe  0           25  10         NULL     Numérico
97  C:\Users\Guilherme\Desktop\Guilherme\Tipo 3\SkypeSetup.exe  0           26  10         NULL     AlfaNumérico
97  C:\Users\Guilherme\Desktop\Guilherme\Tipo 3\SkypeSetup.exe  1           24  10         NULL     Caracter

クエリに e.valor を追加すると、次のようになります。

select distinct a.id, a.caminho, c.indexObr, d.id, d.tamanho, d.mask, d.idName, e.valor
from gedaidb.dbo.sistema_Documentos as a
join gedaidb.dbo.sistema_DocType as b on a.idDocType = b.id
join gedaidb.dbo.sistema_DocType_Index as c on b.id = c.docTypeId
join gedaidb.dbo.sistema_Indexes as d on c.indexId = d.id
join gedaidb.dbo.sistema_Indexacao as e on a.id = e.idDocumento
where a.id = 97

これらの行が返されます: (唯一の余分な列は最後の列、勇気です)

97  C:\Users\Guilherme\Desktop\Guilherme\Tipo 3\SkypeSetup.exe  0   25  10  NULL    Numérico    11111
97  C:\Users\Guilherme\Desktop\Guilherme\Tipo 3\SkypeSetup.exe  0   25  10  NULL    Numérico    aaaa111
97  C:\Users\Guilherme\Desktop\Guilherme\Tipo 3\SkypeSetup.exe  0   25  10  NULL    Numérico    ccccc
97  C:\Users\Guilherme\Desktop\Guilherme\Tipo 3\SkypeSetup.exe  0   26  10  NULL    AlfaNumérico    11111
97  C:\Users\Guilherme\Desktop\Guilherme\Tipo 3\SkypeSetup.exe  0   26  10  NULL    AlfaNumérico    aaaa111
97  C:\Users\Guilherme\Desktop\Guilherme\Tipo 3\SkypeSetup.exe  0   26  10  NULL    AlfaNumérico    ccccc
97  C:\Users\Guilherme\Desktop\Guilherme\Tipo 3\SkypeSetup.exe  1   24  10  NULL    Caracter    11111
97  C:\Users\Guilherme\Desktop\Guilherme\Tipo 3\SkypeSetup.exe  1   24  10  NULL    Caracter    aaaa111
97  C:\Users\Guilherme\Desktop\Guilherme\Tipo 3\SkypeSetup.exe  1   24  10  NULL    Caracter    ccccc

結合されたすべてのテーブルには1対Nの関係があるため、NN関係がないかどうかを知る限り、それらの余分な行を取得するべきではありません

この問題の背後にある理論は何ですか?

4

2 に答える 2

0

テーブルの作成/挿入ステートメントが提供されていた場合は、sqlfiddleを試してみます。それでも、これを試してみてください:-(テストされていないロジックのみなので、テストしてコメントしてください)

注:必要x.rに応じて、where条件とフィールドorder by内を調整できます。row_number()

select x.id, x.caminho, x.indexObr, x.id, x.tamanho, x.mask, x.idName, x.valor
from      
(     
    SELECT  a.id, a.caminho, c.indexObr, d.id, d.tamanho, d.mask, d.idName, e.valor
    row_number() over ( partition by b.val3 e.valor                 
    order by a.id, a.caminho, c.indexObr, d.id, d.tamanho, d.mask, d.idName) r     
    from gedaidb.dbo.sistema_Documentos as a
    join gedaidb.dbo.sistema_DocType as b on a.idDocType = b.id
    join gedaidb.dbo.sistema_DocType_Index as c on b.id = c.docTypeId
    join gedaidb.dbo.sistema_Indexes as d on c.indexId = d.id
    join gedaidb.dbo.sistema_Indexacao as e on a.id = e.idDocumento
    where a.id = 97    
) x     
where x.r > 1 --
于 2013-01-31T18:55:45.700 に答える
0

e.valor に集計関数 (min、max など) を配置するか、テーブル 'e' をテーブル 'a' と 1 対 1 の関係にする派生テーブルに変換しない限り、あなたが得ている結果セットは正しいです - e.valor はそれらの行を互いに異なるものにしていますdistinct

gedaidb.dbo.sistema_Indexacao (テーブル 'e') は明らかに gedaidb.dbo.sistema_Documentos (テーブル 'a') と (少なくとも) 1 対多の関係にあります。そのため、e.valor (またはテーブル e の他のフィールド) に明確な値を取り込むときに見られる「多くの」効果を予測する必要があります。

于 2013-01-31T18:07:41.110 に答える