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

Sql 添加两个具有相似结果和互斥值的选择,sql,oracle,Sql,Oracle,我有这张桌子: 字段1=‘名称’;字段2='value1';字段3='value2' Value2和value3是0或1,并且是互斥的(也就是说,如果名称XXX的字段2是1,那么字段3是0)。 现在我想做一个选择,结果如下: position1 position2 name1 name2 我试过: select field1 as position1 from table where field2 = 1 union all select field1 as position2

我有这张桌子:

字段1=‘名称’;字段2='value1';字段3='value2'

Value2和value3是0或1,并且是互斥的(也就是说,如果名称XXX的字段2是1,那么字段3是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这是可能的,但我不记得怎么做。

你想从你的问题中得到什么还不是100%清楚,但如果我不得不猜测的话,你至少可以使用子查询来获得你想要的:

select 
   (select field1 from table where field2 = 1) as position1, 
   (select field1 from table where field3 = 1) as position2 
from dual;

但是,如果您的表中有多个与
匹配的项,其中field2=1
,则这将不起作用。在这种情况下,您可以使用
rownum=1
或其他一些限制器或聚合,如
Max()
,等等。

首先感谢您的输入

基本上我有一份名单,上面有一名经理和一名秘书;如果你是经理,你不能当秘书,反之亦然。 我忘了添加服务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

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=秘书)。在不了解您的系统的情况下,情况可能并非如此,但很可能如此。

假设表“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”列上添加索引,效果会更好


这里有一些试用代码-

请发布示例输入和输出您的表只有2行?我认为您不需要在那里进行子查询。您应该能够直接连接表。