2013-01-31 2 views
0

Этот запрос:Дополнительные строки на присоединиться к SQL серверу

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 

возвращение этого Resultset:

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 

I вернуть эти строки: (единственная дополнительная колонка - последняя, ​​доблесть)

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 так, насколько я знаю, нет N-N отношения не должны получать эти дополнительные строки

Что такое теория за этим вопросом?

+5

Это нормальное поведение. Обратите внимание, что вы используете 'DISTINCT'. –

+0

То же самое без четкого. Без изменений –

ответ

0

Если вы не поставили агрегированную функцию (мин, макс и т. Д.) На e.valor или не перевернули таблицу 'e' в производную таблицу, которая поместила бы ее в взаимно однозначную связь с таблицей 'a ', то результаты, которые вы получаете, верны - e.valor делает эти строки разными/distinct друг от друга.

gedaidb.dbo.sistema_Indexacao (таблица «e») явно находится в (по крайней мере) отношениях «один ко многим» с gedaidb.dbo.sistema_Documentos (таблица «a»). Таким образом, вы должны предвидеть эффект «большого», который вы видите, когда вы вводите значения, отличные от значения в e.valor (или любые другие поля из таблицы e, если на то пошло).

0

Если были созданы инструкции создания/вставки таблицы, мы бы попробовали sqlfiddle. Тем не менее дать этому попытку: - (UNTESTED & логика только, следовательно, проверить его и комментарии, пожалуйста)

Примечание: Вы можете настроить x.r где состояние и 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 -- 
Смежные вопросы