通过比较多个列进行去重的SQL语句

5

我有一个查询语句

Select col1,col2,col3 
from table;

表格包含以下行:
col1 col2 col3 
A    | B  | C
B    | A  | C
C    | B  | C

我需要比较多列数据,以获取包含单一组合 A,B,C 的不同结果。

结果应该是这样的:

col1 col2 col3 
A    | B  | C

查询结果行的顺序可以更改。

我该如何实现这个功能?


3
这个关系型数据库管理系统是Oracle/mysql/SqlServer中的哪一个? - Abhik Chakraborty
3个回答

2
请尝试这个,我不确定您的具体要求。但是在上面给出的样本数据中,我找到了这个解决方案。
With CTE as
(
     Select MIN(col1) as col1 from MyTable
)
Select * from CTE
cross apply
    (
        Select MIN(col2) as col2 from MyTable
        where col2 <> CTE.col1
    )as a
cross apply
    (
        Select MIN(col3) as col3 from MyTable
        where col3 not in (CTE.col1,a.col2)
    )as b

DEMO HERE


0
SELECT *
FROM table
WHERE (col1 = 'A' AND col2 = 'B' AND col3 = 'C')

OP想要根据所有三列删除重复行,但顺序不应该有影响。你正在按静态值过滤,但除了它只是一个例子以外,它也是不正确的,因为 col3 ='A' AND col1 ='B'AND col2 ='C' 也会被允许。 - Tim Schmelter
是的,列的值不是静态的! - Praveen
2
你能否给你的答案添加一些解释? - Alex Char
这将按照问题中所请求的方式返回单个组合A、B、C吗? - Matt

0

如果列数和值已知,您也可以使用以下查询。

The CASE statement is the closest to IF in SQL

SELECT
         CASE 
              WHEN (col1 = 'A' and col2 = 'B' and col3='C') or (col1 = 'C' and col2 = 'A' and col3='B') or (col1 = 'B' and col2 = 'C' and col3='A' )
                 THEN 1 
              ELSE 0 
         END  as RESULT, * 
FROM table

从结果中,您可以通过检查 RESULT==1(integer) 的值来获取所需的输出。

如果您希望将 结果作为布尔值 返回,则可以进行 CAST 操作,如下:

SELECT
     CAST(
         CASE 
              WHEN (col1 = 'A' and col2 = 'B' and col3='C') or (col1 = 'C' and col2 = 'A' and col3='B') or (col1 = 'B' and col2 = 'C' and col3='A' )
                 THEN 1 
              ELSE 0 
         END  as RESULT_INT)
     as RESUTL, * 
FROM table

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接