Самостоятельное СОЕДИНЕНИЕ, чтобы найти родительскую информацию, которая совпадает с данными строки —

#sql #sql-server #tsql #sql-server-2008 #join

Вопрос:

Я пытаюсь выполнить запрос в MS SQL и не могу его разрешить. У меня есть столик для сотрудников:

 Id  Name     Surname  FatherName  MotherName  WifeName  Pincode  isChild
--  -------  -------  ----------  ----------  --------  -------  -------
1   John     Green    James       Sue         null      101011   1
2   Michael  Sloan    Barry       Lilly       null      101011   1
3   Sally    Green    Andrew      Molly       Jemi      101011   1
4   Barry    Sloan    Soul        Paul        Lilly     101011   0
5   James    Green    Ned         White       Sue       101011   0
 

Мне нужен запрос, который выбирает строки, в которых имя отца и имя матери ребенка совпадают с именем и именем жены. Для примера таблицы, где я хочу вернуть результат строк, в которых имя отца и матери совпадает со столбцом имя и имя жены. Например, id=1, где имя отца Джона Джеймс и имя матери Сью совпадают с идентификатором 5, который возвращает Джеймса как имя, а Сью как имя жены. Поэтому мой запрос должен вернуться (это мой ожидаемый результат)

 Id  Name     Surname  FatherName  MotherName  WifeName  Pincode  isChild
--  -------  -------  ----------  ----------  --------  -------  -------
5   James    Green    Ned         White       Sue       101011   0
4   Barry    Sloan    Soul        Paul        Lilly     101011   0
 

Я попытался выполнить приведенный ниже запрос, но он проверяет только Джеймса. Как изменить мой запрос так, чтобы он проверял все имена и возвращал ожидаемый результат.

 select * FROM employees
where first_name like '%James%'
and wife_name like '%Sue%'
and pincode=101011;
 

Любые советы по этому поводу будут действительно полезны. Я новичок в объединениях, мне нужна помощь в написании самостоятельного объединения, чтобы получить результат.

Комментарии:

1. пожалуйста, поделитесь сценариями создания таблицы и вставки данных для приведенного выше примера.

Ответ №1:

 select *
from thetable as p -- the parent/father
where exists -- with one child at least
(
    select * 
    from thetable as c 
    where c.fathername = p.name 
    and c.mothername = p.wifename
    -- lastname?
)
 

Ответ №2:

Слишком длинно для комментария, но и не предназначено для критики того, с чем вы работаете. Пожалуйста, примите это как конструктивную критику.

Помимо ОЧЕНЬ ПЛОХОГО ДИЗАЙНА содержимого таблицы, сначала следует исправить это, прежде чем вы слишком углубитесь в то, над чем работаете. Более типичным дизайном может быть стол с людьми. Теперь, чтобы наладить отношения, вы могли бы сделать пару способов. Один из них заключается в том, что в записи каждого отдельного человека вы добавляете 2 дополнительных идентификатора. идентификатор отца, идентификатор матери. Эти идентификаторы будут соединяться непосредственно с дочерними и жесткими строками для сопоставления. Возьмите фамилию, например Смит или Джонс. Затем посмотрите на множество примеров, когда «Джон Смит» может существовать, да, много, и вероятность найти подходящую жену по имени Сью, Мэри или как-то еще. Но даже это может привести к множеству возможностей. Да, вы добавляете PIN-код, но даже компьютер может сгенерировать случайный pin-код 1234.

Имея идентификаторы, нет НИКАКОЙ двусмысленности в том, с кем связаны отношения.

Если бы данные были слегка изменены на что-то вроде

 Id  Name     Surname        FatherID    MotherID    SpouseID  
--  -------  -------        ----------  ----------  --------  
1   John     Green          5           6           null      
2   Michael  Sloan          4           3           null      
3   Lilly    Sloan          null        null        4
4   Barry    Sloan          null        null        3
5   James    Green          9           10          6         
6   Sue      Green          7           8           5         
7   Bill     Jones          null        null        8       
8   Martha   Jones          null        null        7
9   Brian    Green          null        null        10
10  Beth     Smith-Green    null        null        9
 

Итак, в этом измененном примере вы сразу видите, что у Джона Грина № 1 родители отца (идентификатор № 5) — Джеймс, а Мать (идентификатор№6) — Сью. Но даже исходя из этого, Джеймс является ребенком для отца (идентификатор № 9) Брайана и матери (идентификатор№10) Бет. Этот сценарий показывает способность на уровне дедушки и бабушки, и что каждый из Джеймса и Сью также являются детьми, но для их соответствующих родителей. Родители Сью по фамилии Джонс.

Для Майкла Слоана, родителей №4 Барри и № 3 Лилли.

И я дополнительно добавил удостоверение личности супруга. Это предотвращает избыточность имен людей, скопированных повсюду. Затем вы можете запросить на основе соответствующих идентификаторов родителей ребенка, чтобы узнать, какое имя является обнадеживающим, НАПРИМЕР, угадайте.

Таким образом, даже если вы не решите относительно простой запрос, исправление базовой основы вашей базы данных и отношений is в долгосрочной перспективе поможет облегчить ваши запросы в будущем.

Ответ №3:

Попробуйте это:

 SELECT
        T2.*
FROM    Employee T1
JOIN    Employee T2 ON  T2.Name     =   T1.FatherName
                    AND T2.WifeName =   T1.MotherName