在 Oracle 中按别名分组
group by alias in Oracle
我需要获取所有状态 (1,2,3,4),不重复。
1 xxx
2 yyy
3 zzz
4 jjj
我的第一个也是唯一的想法是获取所有状态并将它们分组:
select state1 as state,desc1 as desc from table where id=X
Union
select state2 as state,desc2 as desc from table where id=X
这在示例中得到 6 行。因此,为了丢弃重复项,我尝试使用别名:
select state,desc from
(
select state1 as state,desc1 as desc from table where id=X
Union
select state2 as state,desc2 as desc from table where id=X
)
group by state;
但是我得到的错误不是 GROUP BY 表达式。
我看到了类似的问题,但我无法解决问题。
您的第一个查询不起作用可能是因为 desc1 和 desc2 列具有不同的类型,例如char(10) 和 char(20)。这是来自 SQL Fiddle 的 example 显示了这种效果。如果您在左侧窗格中将 char(20) 更改为 char(10),查询将起作用。
所有 select 列表项都必须在分组依据中,或者是聚合。您可以在 group-by 子句中同时包含 state, desc
,但使用 distinct
会更整洁;然而,union
(没有 all
)无论如何都会抑制重复,所以这里都不需要。
正如 Bluefeet 在其他地方提到的,desc
是一个关键字,在 order-by 子句中具有含义,因此它不是一个好的列名或别名。
这有四行,而不是六行:
select state1 as state_x, desc1 as desc_x from t42 where id = 'X'
union
select state2 as state_x, desc2 as desc_x from t42 where id = 'X';
| STATE_X | DESC_X |
|---------|--------|
| 1 | xxx |
| 2 | yyy |
| 3 | zzz |
| 4 | jjj |
SQL Fiddle。目前尚不清楚为什么您认为自己得到了六行,或者您真正做的不同。
UNION 应该删除任何重复项。如果没有,那么您应该检查数据——也许您在文本列中有多余的空格。
尝试这样的事情。
select state1 as state,TRIM(desc1) as desc from table where id=X
Union
select state2 as state,TRIM(desc2) as desc from table where id=X
我需要获取所有状态 (1,2,3,4),不重复。
1 xxx
2 yyy
3 zzz
4 jjj
我的第一个也是唯一的想法是获取所有状态并将它们分组:
select state1 as state,desc1 as desc from table where id=X
Union
select state2 as state,desc2 as desc from table where id=X
这在示例中得到 6 行。因此,为了丢弃重复项,我尝试使用别名:
select state,desc from
(
select state1 as state,desc1 as desc from table where id=X
Union
select state2 as state,desc2 as desc from table where id=X
)
group by state;
但是我得到的错误不是 GROUP BY 表达式。
我看到了类似的问题,但我无法解决问题。
您的第一个查询不起作用可能是因为 desc1 和 desc2 列具有不同的类型,例如char(10) 和 char(20)。这是来自 SQL Fiddle 的 example 显示了这种效果。如果您在左侧窗格中将 char(20) 更改为 char(10),查询将起作用。
所有 select 列表项都必须在分组依据中,或者是聚合。您可以在 group-by 子句中同时包含 state, desc
,但使用 distinct
会更整洁;然而,union
(没有 all
)无论如何都会抑制重复,所以这里都不需要。
正如 Bluefeet 在其他地方提到的,desc
是一个关键字,在 order-by 子句中具有含义,因此它不是一个好的列名或别名。
这有四行,而不是六行:
select state1 as state_x, desc1 as desc_x from t42 where id = 'X'
union
select state2 as state_x, desc2 as desc_x from t42 where id = 'X';
| STATE_X | DESC_X |
|---------|--------|
| 1 | xxx |
| 2 | yyy |
| 3 | zzz |
| 4 | jjj |
SQL Fiddle。目前尚不清楚为什么您认为自己得到了六行,或者您真正做的不同。
UNION 应该删除任何重复项。如果没有,那么您应该检查数据——也许您在文本列中有多余的空格。
尝试这样的事情。
select state1 as state,TRIM(desc1) as desc from table where id=X
Union
select state2 as state,TRIM(desc2) as desc from table where id=X