Это ваш пример данных:
SELECT * FROM dogs d LEFT JOIN litters l ON d.LitterId = l.id
ID | Reg | Name | LitterID | ID | Dateofbirth | FatherID | motherID
:- | :----------- | :----- | :------- | ---: | :------------------ | -------: | -------:
3 | NO34567/2012 | Fido | 9000 | 9000 | 01/04/2012 00:00:00 | 2 | 1
4 | NO34568/2012 | Fido | 6000 | 6000 | 01/06/2014 00:00:00 | 9 | 8
5 | NO34569/2012 | Fido | 5000 | 5000 | 01/05/2013 00:00:00 | 7 | 8
6 | NO34567/2012 | Fido | 9000 | 9000 | 01/04/2012 00:00:00 | 2 | 1
2 | NO12345/2010 | king | 8000 | <em>null</em> | <em>null</em> | <em>null</em> | <em>null</em>
1 | NO23456/2009 | Queen | 7000 | <em>null</em> | <em>null</em> | <em>null</em> | <em>null</em>
7 | NO12346/2010 | God | 8000 | <em>null</em> | null | <em>null</em> | <em>null</em>
8 | NO23457/2009 | Godess | 7000 | <em>null</em> | <em>null</em> | <em>null</em> | <em>null</em>
9 | NO12346/2010 | Devil | 8000 | <em>null</em> | <em>null</em> | <em>null</em> | <em>null</em>
Я понимаю, что вы ищете собак, у которых один отец и с тем же именем. В SQL Server простое решение состоит в том, чтобы использовать оконную функцию COUNT(...) OVER(...)
, чтобы подсчитать, сколько таких дубликатов существует для каждой записи.
Рассмотрим:
SELECT * FROM (
SELECT
d.ID,
d.Reg,
d.Name,
d.LitterID,
l.Dateofbirth,
l.FatherID,
l.MotherID,
COUNT(*) OVER(PARTITION BY d.Name, l.FatherId) cnt
FROM dogs d
LEFT JOIN litters l ON d.LitterId = l.ID
) x WHERE cnt > 1
Урожайность:
ID | Reg | Name | LitterID | Dateofbirth | FatherID | motherID | cnt
:- | :----------- | :--- | :------- | :------------------ | -------: | -------: | --:
3 | NO34567/2012 | Fido | 9000 | 01/04/2012 00:00:00 | 2 | 1 | 2
6 | NO34567/2012 | Fido | 9000 | 01/04/2012 00:00:00 | 2 | 1 | 2
Теперь все, что осталось сделать, - это несколько дополнительных самостоятельных соединений, чтобы восстановить имя родителей:
SELECT
x.DateOfBirth,
x.ID,
x.Reg,
x.Name,
x.FatherID,
d_father.Reg FatherReg,
d_father.Name FatherName,
x.MotherID,
d_mother.Reg MotherReg,
d_mother.Name MotherName
FROM
(
SELECT
d.ID,
d.Reg,
d.Name,
d.LitterID,
l.Dateofbirth,
l.FatherID,
l.MotherID,
COUNT(*) OVER(PARTITION BY d.Name, l.FatherId) cnt
FROM dogs d
LEFT JOIN litters l ON d.LitterId = l.ID
) x
INNER JOIN dogs d_mother ON d_mother.ID = x.MotherID
INNER JOIN dogs d_father ON d_father.ID = x.FatherID
WHERE x.cnt > 1
Результаты:
DateOfBirth | ID | Reg | Name | FatherID | FatherReg | FatherName | MotherID | MotherReg | MotherName
:------------------ | :- | :----------- | :--- | -------: | :----------- | :--------- | -------: | :----------- | :---------
01/04/2012 00:00:00 | 3 | NO34567/2012 | Fido | 2 | NO12345/2010 | king | 1 | NO23456/2009 | Queen
01/04/2012 00:00:00 | 6 | NO34567/2012 | Fido | 2 | NO12345/2010 | king | 1 | NO23456/2009 | Queen
Демонстрация на DB Fiddle