2013-05-23 3 views
-1

У меня есть следующий запрос:Transact SQL JOIN

SELECT MS.idReg, MS.dsMotivo, A.contrato FROM MS 
INNER JOIN S 
ON S.motivoSiniestro = MS.idReg 
INNER JOIN C 
ON C.n__contrat = S.n__contrat 
INNER JOIN A 
ON A.n__article = C.n__article 

Таблица MS имеет только 12 записей, те, которые мне нужно и другие имеют много больше записей. Моя проблема в том, что я хочу только 12 записей из MS и их колонки contrato, но я получаю гораздо больше. Попробовали много сочетаний INNER, OUTER, LEFT и RIGHT. Любая помощь?

+3

Пробовали ли вы 'DISTINCT'? Кроме того, вы уверены, что нет никаких статей и контрактов на запись MS? – Oded

+3

Вы говорите, что хотите запроса A.contrato в запросе. Что делать, если в A записано много записей для каждой записи на C и много записей в C для S и много записей в S для MS. Тогда, с каким А.контато мы должны вернуться? Макс. Их в? Вот почему вы получаете более 12 записей. –

ответ

1

Попробуйте один -

SELECT MS.idReg, MS.dsMotivo, A.contrato 
FROM dbo.MS 
OUTER APPLY (
    SELECT TOP 1 A.contrato 
    FROM dbo.S 
    JOIN dbo.C ON C.n__contrat = S.n__contrat 
    JOIN dbo.A ON A.n__article = C.n__article 
    WHERE S.motivoSiniestro = MS.idReg 
) s 
+0

Все эти запросы возвращают больше реестров, чем те, что указаны в MS, потому что существуют различные комбинации из трех значений. – Oscar

+0

Попробуйте обновленный ответ. – Devart

2

Вы получаете слишком много записей, потому что есть несколько значений A.contrato для каждой строки в таблице MS. Сервер Sql не знает, какой из всех значений A.contrato следует взять, чтобы он возвращал все из них. Сначала вам нужно решить, какой из них вы хотите.

Если какой-либо будет делать, вы можете просто написать запрос следующим образом:

SELECT MS.idReg, MS.dsMotivo, MAX(A.contrato) 
FROM MS 
    INNER JOIN S 
     ON S.motivoSiniestro = MS.idReg 
    INNER JOIN C 
     ON C.n__contrat = S.n__contrat 
    INNER JOIN A 
     ON A.n__article = C.n__article 
GROUP BY MS.idReg, MS.dsMotivo 
Смежные вопросы