如何从同一张表的4列中提取去重后单列结果?
解决多列提取去重单列值的问题
嗨保罗!我明白你遇到的问题了——你想要把四列里的所有值合并成一列后去重,而不是对整行的列组合去重。原来的SELECT DISTINCT e1l,e2l,e1s,e2s语句确实只会返回这四个列的唯一组合行,这和你想要的结果完全不是一回事。
正确的SQL写法
你需要先把四列的数据“堆叠”成单独一列,再对这一列进行去重操作。这里用UNION ALL来合并四列的结果,外层再用DISTINCT去重,同时过滤掉空值:
SELECT DISTINCT value FROM ( -- 依次将每一列作为单独的行提取出来 SELECT E1L AS value FROM jobmovement UNION ALL SELECT E2L AS value FROM jobmovement UNION ALL SELECT E1S AS value FROM jobmovement UNION ALL SELECT E2S AS value FROM jobmovement ) AS combined_values -- 过滤掉空值(如果你的数据里有空值,不需要的话可以去掉这行) WHERE value IS NOT NULL;
为什么这个写法有效?
- 内层的子查询用
UNION ALL把四列的所有数据都放到一个名为value的列里,不管重复与否。 - 外层的
SELECT DISTINCT会对这个单列的所有值进行去重,得到你想要的唯一值列表。 WHERE value IS NOT NULL会过滤掉数据中的空值(就像你示例里的空单元格),如果你的业务允许保留空值,可以去掉这一行。
针对你示例数据的验证
假设你的表数据如下:
| E1L | E2L | E1S | E2S |
|---|---|---|---|
| 178 | 178 | 178 | 178 |
| 216 | 216 | ||
| 178 | |||
| 217 | 217 | 178 | 216 |
执行上面的SQL后,会返回:
178 216 217
完全符合你期望的结果。
小提示
如果你使用的数据库支持UNION(而不是UNION ALL),也可以直接用UNION来合并四列,因为UNION本身会自动去重,但UNION ALL+DISTINCT的性能通常更好,尤其是在数据量较大的时候——因为UNION ALL不会在合并时做去重操作,只在外层做一次,效率更高。
内容的提问来源于stack exchange,提问作者Macca424
相关产品推荐
相关产品推荐

