Выберите строки с одинаковым идентификатором, но другое значение в другом столбце
Я пробовал часами и читал много сообщений, но я до сих пор не могу понять, как справиться с этим запросом:
У меня есть таблица вроде этого:
+------+------+
|ARIDNR|LIEFNR|
+------+------+
|1 |A |
+------+------+
|2 |A |
+------+------+
|3 |A |
+------+------+
|1 |B |
+------+------+
|2 |B |
+------+------+
Я хотел бы выбрать ARIDNR, который встречается более одного раза с различным LIEFNR.
Результат должен выглядеть примерно так:
+------+------+
|ARIDNR|LIEFNR|
+------+------+
|1 |A |
+------+------+
|1 |B |
+------+------+
|2 |A |
+------+------+
|2 |B |
+------+------+
Ответы
Ответ 1
Это должно сделать это:
SELECT *
FROM YourTable
WHERE ARIDNR IN (
SELECT ARIDNR
FROM YourTable
GROUP BY ARIDNR
HAVING COUNT(*) > 1
)
Идея состоит в том, чтобы использовать внутренний запрос для идентификации записей, которые имеют значение ARIDNR
, которое возникает в данных более 1 раза, а затем все столбцы из одной таблицы на основе этого набора значений.
Ответ 2
Попробуйте это пожалуйста. Я проверил его, и он работает:
SELECT *
FROM Table
WHERE ARIDNR IN (
SELECT ARIDNR
FROM Table
GROUP BY ARIDNR
HAVING COUNT(distinct LIEFNR) > 1
)
Ответ 3
Присоединитесь к одной и той же таблице к себе. Используйте внутреннее соединение, чтобы строки, которые не совпадали, были отброшены. В объединенном наборе будут строки, имеющие соответствующий ARIDNR в другой строке таблицы с другим LIEFNR. Разрешить тем ARIDNR появляться в окончательном наборе.
SELECT * FROM YourTable WHERE ARIDNR IN (
SELECT a.ARIDNR FROM YourTable a
JOIN YourTable b on b.ARIDNR = a.ARIDNR AND b.LIEFNR <> a.LIEFNR
)
Ответ 4
Это старый вопрос, но я считаю, что мне также нужно решение для этого время от времени. Предыдущие ответы хороши и хорошо работают, я лично предпочитаю использовать CTE, например:
DECLARE @T TABLE (ARIDNR INT, LIEFNR varchar(5)) --table variable for loading sample data
INSERT INTO @T (ARIDNR, LIEFNR) VALUES (1,'A'),(2,'A'),(3,'A'),(1,'B'),(2,'B'); --add your sample data to it
WITH duplicates AS --the CTE portion to find the duplicates
(
SELECT ARIDNR FROM @T GROUP BY ARIDNR HAVING COUNT(*) > 1
)
SELECT t.* FROM @T t --shows results from main table
INNER JOIN duplicates d on t.ARIDNR = d.ARIDNR --where the main table can be joined to the duplicates CTE
Получает следующие результаты:
1 |
1 | B
2 | B
2 |
Ответ 5
Вы можете просто достичь этого
SELECT *
FROM test
WHERE ARIDNR IN
(SELECT ARIDNR FROM test
GROUP BY ARIDNR
HAVING COUNT(*) > 1)
GROUP BY ARIDNR, LIEFNR;
Спасибо.
Ответ 6
Используйте этот
select * from (
SELECT ARIDNR,LIEFNR,row_number() over
(partition by ARIDNR order by ARIDNR) as RowNum) a
where a.RowNum >1
Ответ 7
Select A.ARIDNR,A.LIEFNR
from Table A
join Table B
on A.ARIDNR = B.ARIDNR
and A.LIEFNR<> B.LIEFNR
group by A.ARIDNR,A.LIEFNR
Ответ 8
$sql="SELECT * FROM TABLE_NAME WHERE item_id=".$item_id;
$query=mysql_query($sql);
while($myrow=mysql_fetch_array($query)) {
echo print_r($myrow,1);
}