如果(MySQL)审计表包含相似的行,是否可以仅查看具有不同值的列?
例如,一个包含四列的表,其中列key
是主键,列id
是匹配行的标识符:
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
在上面的例子中,我需要查询只返回第1,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 :(得分: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 JOIN应该给出相同的结果
答案 1 :(得分: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;
答案 2 :(得分: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;