Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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_Oracle11g - Fatal编程技术网

Sql 如果查询返回为空,如何在字段中复制?

Sql 如果查询返回为空,如何在字段中复制?,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我正在写查询 从两张不同的桌子 表A和表B 这里是查询 select A.OUT_NUM, A.TIMESTAMP, A.LAST_name, A.event_type, A.comments, B.name from TABLEA A left outer join TABLEB B ON A.feed_id = B.id where A.OUT_NUM = '12345'

我正在写查询 从两张不同的桌子

表A和表B

这里是查询

select 
        A.OUT_NUM,
        A.TIMESTAMP,
        A.LAST_name,
        A.event_type, 
        A.comments,
        B.name
   from TABLEA A
   left outer join TABLEB B ON A.feed_id = B.id
   where A.OUT_NUM = '12345'
   and A.event_type In ('cause','status')
B.NAME
event_type=xyz时不为空,否则为空

我只想看到何时
事件\输入('CAUSE','STATUS')
,还想看到name字段,但不想为空

第二张桌子是我想要达到的。

感谢使用NVL()和LAG()函数

使用我的示例数据的一般示例。此查询用数据填充空行-请参阅第一次检查和最后一次检查列:

SELECT id, name, proc_date, proc_type, first_exam_date
     , NVL(prev_exam_date, LAG(prev_exam_date) OVER (ORDER BY name, proc_date)) last_exam_date
  FROM
   (
   SELECT id, name, proc_date, proc_type, first_exam_date
     , NVL(first_exam_date, LAG(first_exam_date) OVER (ORDER BY name, proc_date) ) prev_exam_date
    FROM
  (
  SELECT id
       , name
       , proc_date
       , proc_type
      , (SELECT MIN(proc_date) OVER (PARTITION BY name, proc_date)
           FROM stack_test WHERE proc_type LIKE 'Exam%' AND a.id = id 
       ) first_exam_date
   FROM stack_test a
  ));
  ID    NAME    PROC_DATE    PROC_TYPE    FIRST_EXAM_DATE    LAST_EXAM_DATE
  --------------------------------------------------------------------------
  1    George    1/1/2013    ExamA             1/1/2013      1/1/2013
  2    George    1/3/2013    TreatmentA                      1/1/2013
  3    George    1/5/2013    TreatmentB                      1/1/2013
  4    George    2/1/2013    ExamB             2/1/2013      2/1/2013
  5    George    2/5/2013    TreatmentA                      2/1/2013

对评论中的数据做出一些假设,特别是关于如何匹配和选择替代的
名称
值;还有一些我认为与你相符的虚拟数据:

create table tablea(out_num number,
    equip_name varchar2(5),
    event_type varchar2(10),
    comments varchar2(10),
    timestamp date, feed_id number);

create table tableb(id number, name varchar2(10));

alter session set nls_date_format = 'MM/DD/YYYY HH24:MI';

insert into tablea values (12345, null, 'abcd', null, to_date('02/11/2013 11:12'), 1);
insert into tablea values (12345, null, 'abcd', null, to_date('02/11/2013 11:11'), 1);
insert into tablea values (12345, null, 'abcd', null, to_date('02/11/2013 11:06'), 1);
insert into tablea values (12345, null, 'abcd', null, to_date('02/11/2013 11:06'), 1);
insert into tablea values (12345, null, 'SUB', null, to_date('02/11/2013 11:11'), 2);
insert into tablea values (12345, null, 'SUB', null, to_date('02/11/2013 11:12'), 2);
insert into tablea values (12345, null, 'XYZ', null, to_date('02/11/2013 11:13'), 3);
insert into tablea values (12345, null, 'XYZ', null, to_date('02/11/2013 11:13'), 3);
insert into tablea values (12345, null, 'XYZ', null, to_date('02/11/2013 11:13'), 3);
insert into tablea values (12345, null, 'XYZ', null, to_date('02/11/2013 11:13'), 3);
insert into tablea values (12345, null, 'XYZ', null, to_date('02/11/2013 11:13'), 3);
insert into tablea values (12345, null, 'XYZ', null, to_date('02/11/2013 11:03'), 3);
insert into tablea values (12345, null, 'CAUSE', 'APPLE', to_date('02/11/2013 11:13'), 4);
insert into tablea values (12345, null, 'CAUSE', 'APPLE', to_date('02/11/2013 11:13'), 4);
insert into tablea values (12345, null, 'CAUSE', 'APPLE', to_date('02/11/2013 11:13'), 4);
insert into tablea values (12345, null, 'STATUS', 'BOOKS', to_date('02/11/2013 11:13'), 5);
insert into tablea values (12345, null, 'STATUS', 'BOOKS', to_date('02/11/2013 11:13'), 5);
insert into tablea values (12345, null, 'STATUS', 'BOOKS', to_date('02/11/2013 11:03'), 5);

insert into tableb values(3, 'LION');
这将得到您的结果:

select * from (
    select a.out_num,
        a.timestamp,
        a.equip_name,
        a.event_type,
        a.comments,
        coalesce(b.name,
            first_value(b.name)
                over (partition by a.out_num
                    order by b.name nulls last)) as name
    from tablea a
    left outer join tableb b on a.feed_id = b.id
    where a.out_num = '12345'
    and a.event_type in ('CAUSE', 'STATUS', 'XYZ')
)
where event_type in ('CAUSE', 'STATUS');

   OUT_NUM TIMESTAMP          EQUIP_NAME EVENT_TYPE COMMENTS   NAME     
---------- ------------------ ---------- ---------- ---------- ----------
     12345 02/11/2013 11:03              STATUS     BOOKS      LION       
     12345 02/11/2013 11:13              STATUS     BOOKS      LION       
     12345 02/11/2013 11:13              STATUS     BOOKS      LION       
     12345 02/11/2013 11:13              CAUSE      APPLE      LION       
     12345 02/11/2013 11:13              CAUSE      APPLE      LION       
     12345 02/11/2013 11:13              CAUSE      APPLE      LION       
内部查询包括
XYZ
,如果直接匹配的值为
null
,则使用分析的
first_value()
函数选择
名称
——如果确实永远不会有直接匹配,则可能不需要使用
合并。(如果假设错误,您可能还需要调整
分区依据
顺序依据
子句)。外部查询只是去掉
XYZ
记录,因为您不需要这些记录


如果要从任何匹配的记录中获取
名称
值,只需删除内部查询中的过滤器即可

但现在您可能更有可能拥有多个非空记录;这将为您提供一个与
a.feed\u id
匹配的文件(如果存在),或者为该
out\u num
提供“第一个”(按字母顺序,ish)文件(如果不存在)。您可以通过
b.id
表b
中的任何其他列进行订购;按
表a中的任何内容排序都需要不同的解决方案。如果你只会有一个可能的匹配项,那么这并不重要,你可以省去排序依据,尽管最好还是保留它

如果我为不同的
输出添加更多数据

insert into tablea values (12346, null, 'abcd', null, to_date('02/11/2013 11:11'), 1);
insert into tablea values (12346, null, 'SUB', null, to_date('02/11/2013 11:12'), 2);
insert into tablea values (12346, null, 'XYZ', null, to_date('02/11/2013 11:13'), 6);
insert into tablea values (12346, null, 'CAUSE', 'APPLE', to_date('02/11/2013 11:14'), 4);
insert into tablea values (12346, null, 'STATUS', 'BOOKS', to_date('02/11/2013 11:15'), 5);

insert into tableb values(1, 'TIGER');
…然后这个-刚刚去掉了过滤器,这次我省略了
合并
-对
12345
给出了相同的答案,这对
12346
给出了相同的答案:

select * from (
    select a.out_num,
        a.timestamp,
        a.equip_name,
        a.event_type,
        a.comments,
        first_value(b.name)
            over (partition by a.out_num
                order by b.name nulls last) as name
    from tablea a
    left outer join tableb b on a.feed_id = b.id
)
where out_num = '12346'
and event_type in ('CAUSE', 'STATUS');

   OUT_NUM TIMESTAMP          EQUIP_NAME EVENT_TYPE COMMENTS   NAME     
---------- ------------------ ---------- ---------- ---------- ----------
     12346 02/11/2013 11:14              CAUSE      APPLE      TIGER      
     12346 02/11/2013 11:15              STATUS     BOOKS      TIGER      

。。。如果
TIGER
链接到
abcd
,而不是
XYZ

很抱歉,我不知道“名称字段为空时,是否有办法复制所有数据。”意思是。。。您能否提供一些样本数据,以便我们了解您试图实现的目标?请参阅更新的问题。我只想看到事件类型=原因和状态的位置,但我不想
name
为空。是的,这比@Mowgli更清楚。就目前的情况来看,你实际上是驼背了。您可以进行第二次左外部联接以获取名称,但您的问题似乎是由数据库引起的。为什么不命名一个OUT_NUM级别的字段,为什么它在该表中没有NOTNULL约束。因此,您需要相同的
OUT_NUM
记录中的
NAME
值。。。还是相同的
feed\u id
?只有一个这样的值吗?@AlexPoole是的,这就是我想要的,我希望只有一个值,我没有遇到过我的值超过1的情况,但现在我的目标只有1。Ben我相信name只有在event_type为xyz时才有数据。对不起,我没有给你们否决票,但我仍然不知道如何用nvl和lag实现我所尝试的。Mowgli-我清楚地写给你们:创建样本数据,意味着创建表,用数据填充。你认为我们会为你做这件事吗?或者你想在任何一张桌子上举个例子?这对你有帮助吗?我将张贴一个是工程和测试。但是你将无法测试它。你应该对自己投反对票。阿特,我没有对你投反对票,我也不是sql专家。直到我看到alex的帖子,我才知道你所说的样本数据是什么意思。alex,用户很快就会习惯你和其他人为他们创建样本数据,并且会对我们没有为他们这样做投反对票。这个用户已经写信给我说他希望有一个带有发帖样本的查询,他/她给了我一个帮助,没有投反对票…@Art-这太令人沮丧了。我还以为有人评论说要放数据的图像,而不是我们可以复制/重新创建的东西,但那一定是另一个问题。我真的应该做一个简单的简化示例。非常感谢Alex,我还没有机会看到Art的解决方案,但Alex的工作方式符合我的要求,下次我将发布示例数据。@AlexPoole我知道这越来越复杂,但有没有办法修改它,现在我们正在寻找事件类型为XYZ时,但我只是发现有时候列名中并没有数据,然后事件类型是xyz,当事件类型是abcd时它就存在了。所以,如果其中包含数据而不查看事件类型,是否有办法使其看起来像整个列名?让我知道我是否有任何意义,如果没有,我可以用截图打开新问题。@Mowgli-我添加了一个更新版本,基于假设只有一个
名称
匹配。(另外,对于将来的问题,请不要发布数据或代码的屏幕截图,发布可以复制和使用的文本,这样可以更容易地测试解决方案)。