2016-04-27 3 views
0

Предположим, что у меня есть эта таблица "tab":запрос SQL: Join ту же таблицу

------------------- 
id | value | name | 
------------------- 
1 | 12 | 'to' | 
------------------- 
2 | 13 | 'to' | 
------------------- 
3 | 14 | 'gh' | 
------------------- 

Я хочу, чтобы получить строки, которые имеют одинаковые имена, но diffrent значения. В этом случае это будет первая и вторая строки. я сделал этот запрос:

select * 
from tab t1 
join tab t2 
on t1.ID = t2.ID 
where t1.VALUE != t2.VALUE 
and t1.NAME = t2.NAME 

Но это занимает слишком много времени, чтобы дать мне результаты. Так что мне было интересно, было ли еще одно быстрое решение?

Спасибо!

+4

ли даже работать? 'on t1.ID = t2._ID' – lad2025

+1

Я бы сделал 'где t1.VALUE jarlh

+2

У вас есть индексы на столе? –

ответ

1

Вы можете попробовать это решение, если вам не нужно присоединиться к

SELECT * 
FROM tab t1 
WHERE EXISTS (SELECT 'x' 
       FROM tab t2 
       WHERE t2.id <> t1.id 
       AND t2.name = t1.name 
       AND t2.value <> t1.value 
      ) 
+0

Это работает лучше! благодаря! – dardy

0

Попробуйте

select t1.* from your_table as t1 inner join 
(
select name from your_table 
group by name 
having count(distinct value)>1 
) as t2 on t1.name=t2.name 
+0

Спасибо, но он не возвращает никакого результата ... – dardy

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