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`)