Sql 仅从表中的两列中选择不同的值

Sql 仅从表中的两列中选择不同的值,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,如果我有一张像这样的桌子 1 A 1 B 1 A 1 B 2 C 2 C 我想从这两列中选择distinct,以便 1 2 A B C 我怎样才能说出我的疑问?是连接列并围绕不同的函数运算符包装它们的唯一方法吗?您可以使用联合创建包含两列中所有值的表: select col1 as BothColumns from YourTable union select col2 from YourTable 与union all不同,union删除重复项,即使

如果我有一张像这样的桌子

1 A

1 B

1 A

1 B

2 C

2 C
我想从这两列中选择distinct,以便

1 

2 

A

B

C

我怎样才能说出我的疑问?是连接列并围绕不同的函数运算符包装它们的唯一方法吗?

您可以使用
联合创建包含两列中所有值的表:

select  col1 as BothColumns
from    YourTable
union
select  col2
from    YourTable
union all
不同,
union
删除重复项,即使它们来自
union的同一侧,请尝试:

Select Col1 from YourTable
union
Select Col2 from YourTable
UNION
删除重复记录(其中结果中的所有列都相同),
UNION all
不删除。 请查收

对于多个列,可以选择UNPIVOT

SELECT distinct DistValues
FROM 
   (SELECT Col1, Col2, Col3
   FROM YourTable) p
UNPIVOT
   (DistValues FOR Dist IN 
      (Col1, Col2, Col3)
)AS unpvt;
试试这个-

DECLARE @temp TABLE
(
      Col1 INT
    , Col2 NVARCHAR(50)
)

INSERT INTO @temp (Col1, Col2)
VALUES (1, 'ab5defg'), (2, 'ae4eii')

SELECT disword = (
    SELECT DISTINCT dt.ch
    FROM (
        SELECT ch = SUBSTRING(t.mtxt, n.number + 1, 1) 
        FROM [master].dbo.spt_values n
        CROSS JOIN (
            SELECT mtxt = (
                SELECT CAST(Col1 AS VARCHAR(10)) + Col2
                FROM @temp
            FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'
            )
        ) t
        WHERE [type] = N'p'
        AND number <= LEN(mtxt) - 1
    ) dt
    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'
)

由于要选择的内容位于不同的列中,因此可以使用union如下所示:

select distinct tarCol from  
(select distinct column1 as tarCol from table
 union 
select distinct column2 from table) as tarTab

为什么即使在联合体中也存在差异,请尝试以下方法:

select cast(id  as char(1)) from test
union
select val from test

您可以这样使用来获取多个不同的列值

(SELECT DISTINCT `enodeb` as res, 
                 "enodeb" as columnname 
 FROM `raw_metrics`) 
UNION
(SELECT DISTINCT `interval` as res, 
       "interval" as columnname 
 FROM `raw_metrics`)

@Luv:外部
独立的
将负责删除重复项。多次强制执行排序操作是没有用的。它对我很有效…而且我想知道我是否有超过两列(比如5列)。。。。使用union all的5个查询正在工作,但是否有任何优化的方法来完成它..或者我必须提到5个查询中的5个查询columns@Andomar:如果我们删除外部不同的查询,而只在内部查询中使用
union
,则查询计划是相同的。我看不到两种排序。@拉维辛格:那是对的,即使是两种不同的操作(如
disect
union
)也可能重复使用相同的排序。我会投票支持你的答案:)但我想要两个不同的列,而不是一列。对于多个列(varchar(…),使用XML(参见第一个示例)-Col1+Col2+…我不能不说这个答案令人印象深刻,甚至令人恐惧,因为它不必要的复杂性。在第一个解决方案中不需要使用
distinct
。之前没有因为奇怪的
cast
,而对此进行投票,但关于
联合

(SELECT DISTINCT `enodeb` as res, 
                 "enodeb" as columnname 
 FROM `raw_metrics`) 
UNION
(SELECT DISTINCT `interval` as res, 
       "interval" as columnname 
 FROM `raw_metrics`)