Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将同一表中的多个子查询转换为一个查询_Sql_Oracle - Fatal编程技术网

Sql 将同一表中的多个子查询转换为一个查询

Sql 将同一表中的多个子查询转换为一个查询,sql,oracle,Sql,Oracle,在这里,我试图将同一个表中的三个不同子查询转换为一个子查询,该子查询将分布到三个不同的列中 有可能吗。? 我的实际问题是--- 想变成这样吗 select tu.pi_no, ( SELECT pu_DATE FROM tabl1 WHERE pi_no = tu.pi_no AND si_no IN( 45,46,47) ) from pub

在这里,我试图将同一个表中的三个不同子查询转换为一个子查询,该子查询将分布到三个不同的列中

有可能吗。? 我的实际问题是---

想变成这样吗

select tu.pi_no, ( SELECT pu_DATE
                   FROM tabl1
                   WHERE pi_no   = tu.pi_no
                   AND si_no  IN( 45,46,47)
                 )
from public tu;
希望输出如下所示:

PI_NO || con_date(45) || subjvis(46) || initDate(47)
----------------------------------------
1234  || 14-DEC-2017 || 12-DEC-2017||15-DEC-2017    

这在oracle中可以实现吗?我将用联接替换子查询

SELECT
    tu.pi_no,
    t1.pu_date AS con_date,
    t2.pu_date AS subjvis,
    t3.pu_date AS initDate
FROM
   public tu
   LEFT JOIN tabl1 t1 ON tu.pi_no = t1.pi_no AND t1.si_no = 45
   LEFT JOIN tabl1 t2 ON tu.pi_no = t2.pi_no AND t2.si_no = 46
   LEFT JOIN tabl1 t3 ON tu.pi_no = t3.pi_no AND t3.si_no = 47

您不能从选择列表中的子查询返回多个列。

如果您要在
pi\u no
字段中加入,则下面的“加入”应起作用。如果对于给定的
pi_no
,未找到
si_no
的特定值,例如45,则将填充空值。尝试:

SELECT tu.pi_no,
CASE WHEN a.si_no = 45 THEN a.pu_DATE ELSE NULL END AS con_date,
CASE WHEN a.si_no = 46 THEN a.pu_DATE ELSE NULL END AS subjvis,
CASE WHEN a.si_no = 47 THEN a.pu_DATE ELSE NULL END AS initDate
FROM
PUBLIC tu
LEFT JOIN
tabl1 a
ON tu.pi_no = a.pi_no;

将条件逻辑与聚合函数MAX一起使用,以获得表PUBLIC粒度的标量子查询值

目标是返回对象的所有记录,
public
(该名称不太理想,因为它是一个函数)。由于对象的假定键
PUBLIC
pi\u no
,因此我们将此列放在group by子句中,以确保查询的粒度相同

我们采用条件逻辑的最大值来获得有值的记录(假设
tabl1
的键是
pi\u no,si\u no

以下是解决方案:

SELECT
    p.pi_no,
    MAX(DECODE(si_no,45,t.pu_date,TO_DATE(NULL) ) ) con_date,
    MAX(DECODE(si_no,46,t.pu_date,TO_DATE(NULL) ) ) subjvis,
    MAX(DECODE(si_no,47,t.pu_date,TO_DATE(NULL) ) ) initdate
FROM
    public p
    LEFT OUTER JOIN tabl1 t ON pi_no = p.pi_no
                               AND si_no IN ( 45, 46, 37)
GROUP BY
    p.pi_no;

您正在尝试加入
public
tabl1
表吗?如果是,连接在哪个字段上?@Vashi试图基于
pi\u no=p.pi\u no
进行连接。PI_NO可公开使用,表1最后一个标量查询具有以下条件,
和event_NO=47
。这应该是,
和si_no=47
tabl1
的记录比
public
多。这将产生太多记录。根据描述,我们不清楚关系的类型(一对多、一对一等)。您希望从这两个表中的哪一个显示所有的
pi\u no
?您的主表。由于OP查询
si_no=45
si_no=46
si_no=47
,因此在
public
中,每个
pi_no
必须至少有三条记录,除非其中只有一条记录产生某些结果。也就是说,只有当3列中至少有2列为空时,您的查询才会工作。而且可能还有更多类似于
si_no=50
SELECT
    p.pi_no,
    MAX(DECODE(si_no,45,t.pu_date,TO_DATE(NULL) ) ) con_date,
    MAX(DECODE(si_no,46,t.pu_date,TO_DATE(NULL) ) ) subjvis,
    MAX(DECODE(si_no,47,t.pu_date,TO_DATE(NULL) ) ) initdate
FROM
    public p
    LEFT OUTER JOIN tabl1 t ON pi_no = p.pi_no
                               AND si_no IN ( 45, 46, 37)
GROUP BY
    p.pi_no;