#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