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

除非您在 e.valor 上放置一个聚合函数(最小值、最大值等),或者将表 'e' 转换为派生表,从而将其与表 'a' 建立一对一的关系,否则你得到的结果集是正确的—— e.valor 使这些行distinct彼此不同。

gedaidb.dbo.sistema_Indexacao(表'e')显然(至少)与gedaidb.dbo.sistema_Documentos(表'a')存在一对多关系。因此,您应该预料到当您在 e.valor(或表 e 中的任何其他字段)中引入不同的值时所看到的“多”效应。

于 2013-01-31T18:07:41.110 回答
0

如果提供了表创建/插入语句,那么我们将尝试使用 sqlfiddle。尽管如此,请尝试一下:-(仅未经测试和逻辑,因此请对其进行测试并发表评论)

注意:您可以根据需要调整x.rwhere 条件和字段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 回答