gpt4 book ai didi

sql - 从同一个表的多列中选择不同的值

转载 作者:行者123 更新时间:2023-12-03 11:40:17 25 4
gpt4 key购买 nike

我正在尝试构建一个 SQL 语句,该语句从位于同一个表中的多个列返回唯一的非空值。

 SELECT distinct tbl_data.code_1 FROM tbl_data
WHERE tbl_data.code_1 is not null
UNION
SELECT tbl_data.code_2 FROM tbl_data
WHERE tbl_data.code_2 is not null;

比如tbl_data如下:
 id   code_1    code_2
--- -------- ----------
1 AB BC
2 BC
3 DE EF
4 BC

对于上表,SQL 查询应返回两列中所有唯一的非空值,即:AB、BC、DE、EF。

我对 SQL 相当陌生。我上面的语句有效,但是有没有更简洁的方法来编写这个 SQL 语句,因为这些列来自同一个表?

最佳答案

最好在您的问题中包含代码,而不是含糊不清的文本数据,以便我们都使用相同的数据。这是我假设的示例架构和数据:

CREATE TABLE tbl_data (
id INT NOT NULL,
code_1 CHAR(2),
code_2 CHAR(2)
);

INSERT INTO tbl_data (
id,
code_1,
code_2
)
VALUES
(1, 'AB', 'BC'),
(2, 'BC', NULL),
(3, 'DE', 'EF'),
(4, NULL, 'BC');

Blorgbeard评论说, DISTINCT您的解决方案中的子句是不必要的,因为 UNION运算符消除重复行。有一个 UNION ALL不消除重复的运算符,但在这里不合适。

在没有 DISTINCT 的情况下重写您的查询条款是这个问题的一个很好的解决方案:
SELECT code_1
FROM tbl_data
WHERE code_1 IS NOT NULL
UNION
SELECT code_2
FROM tbl_data
WHERE code_2 IS NOT NULL;

两列在同一个表中并不重要。即使列在不同的表中,解决方案也是相同的。

如果您不喜欢两次指定相同过滤器子句的冗余,您可以在过滤之前将联合查询封装在虚拟表中:
SELECT code
FROM (
SELECT code_1
FROM tbl_data
UNION
SELECT code_2
FROM tbl_data
) AS DistinctCodes (code)
WHERE code IS NOT NULL;

我发现第二个的语法更难看,但它在逻辑上更简洁。但是哪一个表现更好呢?

我创建了一个 sqlfiddle这表明 SQL Server 2005 的查询优化器为两个不同的查询生成相同的执行计划:

The query optimizer produces this execution plan for both queries: two table scans, a concatenation, a distinct sort, and a select.

如果 SQL Server 为两个查询生成相同的执行计划,那么它们实际上和逻辑上是等效的。

将上述内容与您问题中查询的执行计划进行比较:

The DISTINCT clause makes SQL Server 2005 perform a redundant sort operation.
DISTINCT子句使 SQL Server 2005 执行冗余排序操作,因为查询优化器不知道任何由 DISTINCT 过滤掉的重复项。在第一个查询中会被 UNION 过滤掉反正以后。

此查询在逻辑上与其他两个查询等效,但冗余操作使其效率较低。在大型数据集上,我希望您的查询返回结果集所需的时间比此处的两个更长。不要相信我的话;在您自己的环境中进行实验以确保!

关于sql - 从同一个表的多列中选择不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11302617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com