我有这张桌子:
field1 =' name&#39 ;; field2 =' value1&#39 ;; field3 =' value2';
Value2和value3为0或1且互斥(即,如果name2为1,则名称为XXX,则field3为0)。 现在我想做一个选择结果如下:
position1 position2
name1 name2
我试过了:
select field1 as position1 from table where field2 = 1
union all
select field1 as position2 from table where field3 = 1
但显然那不起作用。然后我试了一下:
select field1 as position1, '0' as position2 from table where field2 = 1
union all
select field1 as position2, '0' as position1 from table where field3 = 1
并且也没有工作。
由于某些设计原因,我需要在Select中使用它,虽然我相信(但是如果我有权限则无法检查)我可以在pl / Sql上创建时态表。
IIRC这是可能的,但我不记得是怎么回事。答案 0 :(得分:2)
假设表" t1"看起来像这样 -
SID NUMBER(0) /* Service ID */
NAME VARCHAR2(10) /* Employee name */
BOSS NUMBER(0) /* Boss boolean */
SECRETARY NUMBER(0) /* Secretary boolean */
使用以下查询应该会产生更好的解释计划 -
select sid, max(boss) pos1, max(secretary) pos2
from (select sid,
decode(boss,1,name) boss,
decode(secretary,1,name) secretary
from t1)
group by sid;
如果你在" sid"上添加一个索引。专栏,甚至更好。
这里有一些试用代码 - http://sqlfiddle.com/#!4/742cc0/11
答案 1 :(得分:1)
它不是100%清楚你想要的问题,但如果我不得不猜测 - 你至少可以使用子查询来获得你想要的东西:
select
(select field1 from table where field2 = 1) as position1,
(select field1 from table where field3 = 1) as position2
from dual;
如果您的表格中有多个与where field2 = 1
匹配的项目,则无效。在这种情况下,您可以使用rownum = 1
或其他限制器或聚合Max()
等等...
答案 2 :(得分:1)
SELECT
T1.field1 AS position1,
T2.field1 AS position2
FROM
MyTable T1
LEFT OUTER JOIN MyTable T2 ON
T2.id = T1.id AND
T2.field3 = 1
WHERE
T1.field2 = 1
我希望那些当然不是你的专栏名称。此外,可能应该组合基本上包含相同数据的两个位列。例如,EmployeeType(1 =经理,2 =秘书)。不知道您的系统可能不是这种情况,但很可能。
答案 3 :(得分:0)
首先感谢您的意见。
基本上我有一份有经理和秘书的服务清单;如果你是一名经理,你不能成为一名秘书,反过来。 我忘了添加服务ID,这会使一切变得更容易,但已经找到了答案:
select t1.position1, t2.position2 from
(select field1 as position1 from table where field2 = 1) t1
left join
(select field1 as position2 from table where field3 = 1) t2
on t1.id = t2.id
这就像一个魅力:D