У меня есть таблица, указанная ниже:
ID Val1
1 AVD1R
1 ART1R
2 CFD4E
3 DER1R
3 DER1F
Я хочу получить те записи, в которых один и тот же ID находится более одного раза с разными Val1.
Требуемый вывод:
ID Val1
1 AVD1R
1 ART1R
3 DER1R
3 DER1F
Я пробовал это:
select id, Val1 from Table1 where count(Val1)>1 group by id; Но не вышло.
@SloanThrasher Я пробовал этот select id, Val1 from Table1 where count(Val1)>1 group by id;, но он не работал.
Почему строки с ID = 3 не отображаются в результате?
@PaulSpiegel Потому что оба значения в столбце Val1 для ID=3 одинаковы.
@PaulSpiegel Простите, что плохо.
@PaulSpiegel Спасибо, я исправил вопрос.






SELECT a.* FROM (
SELECT ID, Val1, COUNT(*) AS Cn FROM Table1 GROUP BY ID, Val1) AS a
LEFT JOIN (
SELECT ID, COUNT(*) AS Cn FROM Table1 GROUP BY ID
) AS b ON a.ID = b.ID
WHERE a.Cn <> b.Cn
Мне нужны только те строки, в которых есть несколько одинаковых ID, но с разными Val1.
@ Рахул шах - извини, я изменил свой ответ
Извините, я изменил свой ответ на:
SELECT t1.* FROM Table1 t1
INNER JOIN Table1 t2
ON t1.id=t2.id AND t1.VAl1 <> t2.Val1;
Образец
MariaDB [bernd]> select * from Table1;
+----+-------+
| id | VAl1 |
+----+-------+
| 1 | AVD1R |
| 1 | ART1R |
| 2 | CFD4E |
| 3 | DER1R |
| 3 | DER1F |
+----+-------+
5 rows in set (0.00 sec)
MariaDB [bernd]> SELECT t1.* FROM Table1 t1
-> INNER JOIN Table1 t2 ON t1.id=t2.id AND t1.VAl1 <> t2.Val1;
+----+-------+
| id | VAl1 |
+----+-------+
| 1 | ART1R |
| 1 | AVD1R |
| 3 | DER1F |
| 3 | DER1R |
+----+-------+
4 rows in set (0.00 sec)
MariaDB [bernd]>
Count(*) не будет работать, потому что у меня есть много других столбцов в таблице, но я хочу сравнить ID с Val1. Хочу только те записи, где Val1 отличается от одного и того же ID.
Вы видели новый ответ без count () :-)
Вы получите дубликаты, если на каждый ID будет больше двух строк.
@Paul Spiegel - спасибо - для предотвращения дублирования вы можете добавить группировать по id, t1.Val1;
Я не знаю, что это за другие столбцы.
Но в SQL Server:
select distinct a.id,val1 from
(
select id,val1
from different
)a
inner join
(
select id,count(id) as cnt
from different
group by id
having count(*)>1
) b
on a.id=b.id
Используйте простую группу по идентификатору и где count (*)> 1