Подтвердить что ты не робот

Выберите строки с одинаковым идентификатором, но другое значение в другом столбце

Я пробовал часами и читал много сообщений, но я до сих пор не могу понять, как справиться с этим запросом:

У меня есть таблица вроде этого:

+------+------+
|ARIDNR|LIEFNR|
+------+------+
|1     |A     |
+------+------+
|2     |A     |
+------+------+
|3     |A     |
+------+------+
|1     |B     |
+------+------+
|2     |B     |
+------+------+

Я хотел бы выбрать ARIDNR, который встречается более одного раза с различным LIEFNR.

Результат должен выглядеть примерно так:

+------+------+
|ARIDNR|LIEFNR|
+------+------+
|1     |A     |
+------+------+
|1     |B     |
+------+------+
|2     |A     |
+------+------+
|2     |B     |
+------+------+
4b9b3361

Ответ 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);


}