2017-02-13 6 views
2
I have a table test 

ID  Status  

1  A  
1  C  
2  A 
3  A 
4  A 
4  C 
4  A 
4  C 
5  A 


Desire Output 

ID  Status 
1  A 
1  C  
4  A 
4  C 
4  A 
4  C 

` Я попытался этоПрисоединение же таблицу с получением повторяющихся строк для некоторого ID

select * from test 
join 
    (
     select id from test t 
     where status='c' 
    ) b 
on b.id=test.id 

Он отлично работает для ID = 1, в котором он дает мне 2 строки, но для ид = 4 это дает мне 8 строки Я не знаю, что я делаю неправильно

ответ

1

Единственная проблема с вашим запросом заключается в том, что подзапрос в настоящее время возвращает несколько идентификаторов, имеющих статус C. Один из вариантов здесь заключается в использовании GROUP BY ID в подзапросе, чтобы каждый из них отображался только один раз.

SELECT t1.ID, t1.Status 
FROM test t1 
INNER JOIN 
(
    SELECT ID 
    FROM test 
    WHERE Status = 'C' 
    GROUP BY ID 
) t2 
    ON t1.ID = t2.ID 
+0

Привет TiM Я получаю 6 строк для некоторого идентификатора, в котором в БД имеется только 4 –

+0

@RedDevil я получить желаемый результат при запуске этого запроса на местном уровне. У вас должна быть какая-то другая проблема с вашими данными. –

+1

Я получил его сейчас, спасибо Тиму за ваш ответ !!!!!! –

1

Вы получаете 8 строк, потому что ваш ID 4 имеет более 'Cs', то только 1

Если вы просто запустите

select id from test t 
    where status='c' 

Вы получите

1, 4, 4 

As

Итак, в вашем нер выберите попробовать с

select DISTINCT id from test t 
    where status='c' 
-1

Если вы хотите пойти на желаемый результат, то попробуйте использовать счетчик:

SELECT 
    t1.ID, t1.Status 
FROM 
    test t1 
GROUP BY 
    t1.ID, t1.Status 
Having 
    COUNT(t1.ID) > 1 
+1

Требование - это число C, являющееся одним или более, а не идентификатором, имеющим счет двух или более (опять же, не мой нисходящий). –

-1

Если вы используете счетчик в вашем внутреннем ВЫБРАТЬ Вам не нужно фильтровать для любого конкретного состояния:

SELECT t1.ID, t1.Status 
FROM [test] t1 
INNER JOIN 
(
    SELECT ID 
    FROM [test] 
    GROUP BY ID 
    HAVING COUNT(*) > 1 
) t2 
    ON t1.ID = t2.ID 
+1

Я не уверен, что OP хочет этого, и, кроме того, ваш запрос - это копия моего ответа (а не мой нисходящий знак). –

+0

Вырезать и вставить да. Но из вопроса;) – shove