2017-10-13 11 views
0

이 코드를 더 잘 쓸 수있는 방법에 대한 의견이 있으십니까?더 나은 방법 : COUNT> 1 인 SELECT *

SELECT Column_A, Column_B, Column_C, Column_D, Column_E 
FROM TABLE_A 
WHERE Column_A IN 
(
    SELECT Column_A 
    FROM 
    (
    SELECT Column_A, COUNT(DISTINCT COLUMN_B) AS Column_B_Count 
    FROM TABLE_A 
    GROUP by Column_A 
    HAVING Column_B_Count > 1 
    ) AS A 
) 
GROUP BY Column_A, Column_B, Column_C, Column_D, Column_E; 

고마워요!

+0

당신이 선택한 모든 컬럼을'GROUP BY' 할 때마다 당신은 실제로 5 개의 컬럼에서 의심스러워 보이기는하지만 실제로는'DISTINCT'를 의미합니다. 'HAVING' 절 뒤에 집계 함수 (예 :'COUNT')를 넣을 수 있습니다. 즉, 'SELECT'목록에서 제거하고 중간 부질의를 제거 할 수 있습니다. 그 외에는 테이블/데이터에 대한 더 많은 정보가 필요합니다. –

답변

0
SELECT DISTINCT 
    A.Column_A 
    , A.Column_B 
    , A.Column_C 
    , A.Column_D 
    , A.Column_E 
FROM 
    TABLE_A AS A 
    JOIN 
     (
      SELECT Column_A 
      FROM TABLE_A 
      GROUP by Column_A 
      HAVING COUNT(DISTINCT COLUMN_B) > 1 
     ) AS Column_B_Count 
    ON A.Column_A = Column_B_Count.Column_A 
+1

기술적으로, 아니요, 원본의 가장 바깥 쪽 'GROUP BY'는 중복 된 항목을 제거하기 때문에 (5 열에서 나 자신이 조금 의심 스럽지만). –

+0

그 점을 지적 해 주셔서 고맙습니다. - 나는 DISTINCT를 추가했습니다. :) –

+1

'having 절에서 해당 컬럼 별명을 참조하는 대신'HAVING COUNT (DISTINCT COLUMN_B)> 1 '을 사용하면 COUNT (DISTINCT COLUMN_B) AS를 Column_B_Count'로 생략 할 수 있습니다. –

0
SELECT Distinct Column_A, 
     Column_B, 
     Column_C, 
     Column_D, 
     Column_E 
FROM TABLE_A 
WHERE Column_A IN 
    (
    SELECT Column_A 
    FROM TABLE_A 
    GROUP by Column_A 
    HAVING COUNT(DISTINCT COLUMN_B) > 1 
    ) 
0

나는 윈도우 기능을 사용할 수 있습니다. 나는 이것이 당신이 원하는 생각 :이 쿼리는 중복을 반환 할 수 있다면 당신은 여전히 ​​select distinct을해야 할 수도 있습니다

select . . . 
from (select a.*, 
      min(column_b) over (partition by a) as min_b, 
      max(column_b) over (partition by a) as max_b, 
     from table_a a 
    ) a 
where min_b <> max_b; 

.

0
SELECT DISTINCT -- same as the final GROUP BY of original query 
    Column_A, Column_B, Column_C, Column_D, Column_E 
FROM TABLE_A 
    -- 
GROUP BY Column_A, Column_B, Column_C, Column_D, Column_E 
QUALIFY -- emulating DISTINCT > 1, which is not allowed in Windowed Aggregates: 
    MIN(COLUMN_B) OVER (PARTITION BY Column_A) 
<> MAX(COLUMN_B) OVER (PARTITION BY Column_A) 

실제 데이터에 따라 그룹별로 중복 즉 적은 수의, 상기 GROUP BY 제거하는 것이 더 효율적일 수있다.