SQL: сравнение записей двух таблиц

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

SQL: сравнение записей двух таблиц

Сообщение uhm » 16.03.2006 (Чт) 17:16

Всем привет!

С SQL'ем я не слишком в ладах, поэтому столкнулся с трудностями в написании, в общем-то, очень простого запроса.

Как правильно сделать такое: есть две таблицы - A и B, в обеих есть поле "Фамилия" (и там, и там может присутствовать одна фамилия несколько раз). Задача - вывести строки из таблицы A, в которых значение поля "Фамилия" встречается также в таблице B. Условие - строки с одинаковыми фамилиями должны выводиться столько раз, сколько они встречаются в таблице A (т. е. если в таблице A два Ивановых, они должны оба попасть в результат ровно по одному раз, если в таблице B есть хотя бы один Иванов).
Быть... или не быть. Вот. В чём вопрос?

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 16.03.2006 (Чт) 17:29

Нашел вот такое:

Код: Выделить всё
SELECT A.Фамилия
FROM A
WHERE (((A.Фамилия) In (SELECT DISTINCT B.Фамилия FROM B)));

Вроде, работает :)
Быть... или не быть. Вот. В чём вопрос?

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 16.03.2006 (Чт) 17:29

Код: Выделить всё

Select a.Фамилия from A a left join B b on a.фамилия = в.фамилия
/*проверено*/
select t.Title from titles t left join  titleauthor ta ON t.title_id=ta.title_id

Select фамилия from A where фамилия in (Select фамилия from b)
Последний раз редактировалось Ramzes 16.03.2006 (Чт) 17:49, всего редактировалось 1 раз.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 16.03.2006 (Чт) 17:30

неуспел :roll:

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 16.03.2006 (Чт) 17:43

Left Join, кстати, не работает. :)
Быть... или не быть. Вот. В чём вопрос?

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 16.03.2006 (Чт) 17:50

uhm
а что не работает? что говорит?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.03.2006 (Чт) 17:58

LEFT JOIN кстати правильно, странно, что не работает. Попробуй добавить OUTER (OUTER LEFT JOIN).
Lasciate ogni speranza, voi ch'entrate.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 16.03.2006 (Чт) 18:04

OUTER у меня не хочет работать, ибо я это все делаю в ACCESS'е, а он там, вроде, не поддерживается.

А проблема, насколько я понимаю, в следующем - если в таблице B два Ивановых, то все Ивановы из таблицы A будут выведены по два раза, т. к. они сджойнятся сначала с первым, а потом со вторым Ивановым из B.
Быть... или не быть. Вот. В чём вопрос?

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 16.03.2006 (Чт) 18:44

Мдя. Все чудесатее и чудесатее.
Задача несколько усложнилась - теперь мне надо сравнивать сразу по трем полям - фамилии, имени и отчеству. Пока, вроде, получилось таким образом:

Код: Выделить всё

SELECT *
FROM Таблица1 AS a LEFT JOIN (SELECT DISTINCT Таблица2.Фамилия, Таблица2.Имя, Таблица2.Отчество  FROM  Таблица2) AS b
ON (a.Отчество=b.Отчество) AND (a.Имя=b.Имя) AND (a.фамилия = b.фамилия)
WHERE b.фамилия<>"";


Проблем две: во-первых, сложно, во-вторых, я не уверен, что это правильно работает. Есть идеи, как это упростить?
Быть... или не быть. Вот. В чём вопрос?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.03.2006 (Чт) 19:19

WHERE b.фамилия IS NOT NULL
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 16.03.2006 (Чт) 21:09

Ага, учту, спасибо.
Быть... или не быть. Вот. В чём вопрос?

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 20.03.2006 (Пн) 20:50

Для поиска (не)совпадений в SQL 2005 лучше использовать EXCEPT и INTERSECT. Читать здесь: http://rsdn.ru/article/db/TSQLinMSSQL2005.xml
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 21.03.2006 (Вт) 10:34

INTERSECT'а, вроде, тоже нет в моем Аксессе.

А, кстати, INNER JOIN в исходной задаче не сработал бы? Или сработал бы, но был бы сложнее, чем LEFT JOIN?
Быть... или не быть. Вот. В чём вопрос?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.03.2006 (Вт) 12:13

INNER JOIN упустил бы строки, для которых нет аналогов во второй таблице.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 21.03.2006 (Вт) 12:14

Почитай в SQL Books Online на Microsoft, чем INNER от OUTER отличается и узнаешь.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 21.03.2006 (Вт) 12:14

А так их и надо было "упустить" :)
Быть... или не быть. Вот. В чём вопрос?


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 105

    TopList  
cron