2014-11-27 2 views
0

유사한 행을 포함하는 (MySQL) 감사 테이블을 사용하면 값이 다른 열만 볼 수 있습니까? , I에서만 1 행을 반환 할 쿼리가 필요 이상mysql의 두 행 사이의 차이점 만 표시

 

key id col1 col2 
1  123  B  C 
2  123  A  C 
3  456  B  C 
4  789  B  A 
5  789  B  B 
6  987  A  C 

예에서 :

예를 들어, 열 key 차 키 4 개의 열 및 칼럼 id를 포함하는 테이블의 행과 일치하는 식별자 2, 4 및 5는 ID가 일치하고 col1과 col2의 값이 서로 다르므로 B, A 및 B, A와 같습니다.

 

key id col1 col2 
1 123 B 
2 123 A 
4 789   A 
5 789   B 

답변

0

저는 매우 효율적인 해결책은 아니지만 원하는 것을 제공합니다. 여기에서 이것을 시도 :

SELECT A.ID, (CASE A.col1 WHEN B.col1 THEN NULL ELSE B.col1 END), (CASE A.col2 WHEN B.col2 THEN NULL ELSE B.col2 END) FROM tblName A 
FULL OUTER JOIN tblName B 
ON 
A.ID=B.ID 
WHERE 
(A.col1=B.col1 AND A.Col2<>B.Col2) 
OR 
(A.col2<>B.col2 AND A.Col1=B.Col1) 

INNER이 더 행을 추가하는 것은 매우 다른 결과를 얻을 수 있다는 점에서, 약간 부자연

0

같은 결과를 제공해야합니다 가입 - 어쨌든 있지만에게 ...

SELECT x.my_key 
    , x.id 
    , IF(y.col1=x.col1,'',x.col1) col1 
    , IF(y.col2=x.col2,'',x.col2) col2 
    FROM my_table x 
    JOIN my_table y 
    ON y.id = x.id 
    AND y.my_key <> x.my_key 
WHERE (y.col1 <> x.col1 OR y.col2 <> x.col2) 
ORDER 
    BY my_key; 
0

나를 안내 해주신 모든 응답 주셔서 감사합니다. 제안 사항을 사용하여 다음과 같이 SQL을 만들었습니다.

SELECT 
    T1.KEY, 
    T1.ID, 
    CASE T2.COL1_DISTINCT_VALUES WHEN 1 THEN NULL ELSE T1.COL1 END AS COL1, 
    CASE T2.COL2_DISTINCT_VALUES WHEN 1 THEN NULL ELSE T1.COL2 END AS COL2 
FROM 
    TAB1 T1 
INNER JOIN 
(
    SELECT 
     ID, 
     COUNT(DISTINCT COL1) AS COL1_DISTINCT_VALUES, 
     COUNT(DISTINCT COL2) AS COL2_DISTINCT_VALUES 
    FROM 
     TAB1 
    GROUP BY 
     ID 
) T2 
ON T1.ID=T2.ID 
WHERE 
    T2.COL1_DISTINCT_VALUES > 1 
OR T2.COL2_DISTINCT_VALUES > 1 
ORDER BY 
    KEY,ID;