添加两个具有相似结果和互斥值的选择

时间:2015-12-23 12:20:56

标签: sql oracle

我有这张桌子:

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这是可能的,但我不记得是怎么回事。

4 个答案:

答案 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