2013-11-21 8 views
0
SELECT p1.last_name, p1.first_name, p1.city, p1.state 
FROM president AS p1 INNER JOIN president AS p2 
ON p1.city = p2.city AND p1.state = p2.state 
WHERE (p1.last_name <> p2.last_name OR p1.first_name <> p2.first_name) 
ORDER BY state, city, last_name; 

Поскольку сценарий говорит, что он должен отображать разные значения имен, имеющих одинаковые города и состояния. Тогда те же имена или фамилии из p1 и p2 будут игнорироваться.Mysql self join производит дубликаты записей

Однако я получаю это на выходе.

last_name first_name City   State 
-------------------------------------------- 
'Adams', 'John Quincy', 'Braintree', 'MA' 
'Adams', 'John',  'Braintree', 'MA' 
'Obama', 'Barack',  'New York', 'NY' 
'Roosevelt', 'Theodore', 'New York', 'NY' 
'Bush', 'George',  'Westmoreland', 'VA' 
'Bush', 'George',  'Westmoreland', 'VA' 
'Monroe', 'James',  'Westmoreland', 'VA' 
'Monroe', 'James',  'Westmoreland', 'VA' 
'Washington', 'George', 'Westmoreland', 'VA' 
'Washington', 'George', 'Westmoreland', 'VA' 

В нем представлены две ценности Джорджа Буша, Джеймса Монро и Джорджа Вашингтона. Я проверил свою базу данных, и я уверен, что нет других повторяющихся значений этих имен.

+0

Давай. Ваш стол достаточно мал, чтобы вы могли просто опубликовать все это, верно? – Strawberry

+0

Конечно, это так. Ваш запрос не делает то, что вы описываете. Из объединения вы получите трех парней из Westmoreland, VA. Для Буша он находит две записи с другим именем (Монро и Вашингтон), поэтому дважды отображает Буша. То же самое для двух других. Если вы найдете 4 президента из одного и того же государства, они появятся три раза каждый. – oerkelens

+0

Хорошо спасибо, теперь я получаю, как работают самоподготовки –

ответ

-2

почему не вы группировать записи?

SELECT p1.last_name, p1.first_name, p1.city, p1.state 
FROM president AS p1 INNER JOIN president AS p2 
ON p1.city = p2.city AND p1.state = p2.state 
WHERE (p1.last_name <> p2.last_name OR p1.first_name <> p2.first_name) 
GROUP BY p1.last_name, p1.first_name, p1.city, p1.state 
ORDER BY state, city, last_name 
+0

Простой DISTINCT был бы предпочтительнее в этом случае – oerkelens

+0

да .. отчетливый и группа от этого будут делать то же самое .. – Mari

0

При сравнении значений первого и последнего имени, попробуйте использовать TRIM в запросе

SELECT p1.last_name, p1.first_name, p1.city, p1.state 
FROM president AS p1 INNER JOIN president AS p2 
ON p1.city = p2.city AND p1.state = p2.state 
WHERE (TRIM(p1.last_name) <> TRIM(p2.last_name) OR TRIM(p1.first_name) <> TRIM(p2.first_name)) 
ORDER BY state, city, last_name; 
1

Самым простым решением является простой DISTINCT

SELECT DISTINCT p1.last_name, p1.first_name, p1.city, p1.state 
FROM president AS p1 INNER JOIN president AS p2 
    ON p1.city = p2.city AND p1.state = p2.state 
WHERE (p1.last_name <> p2.last_name OR p1.first_name <> p2.first_name) 
ORDER BY state, city, last_name; 

(Группа по всех выбранных полей приводит к тому же результату, но менее читаемым и менее ремонтопригодны.)

Смежные вопросы