PL Sql选择其他表中不存在的列值

时间:2015-11-16 18:17:36

标签: sql oracle

我在Oracle下面有两个表。

enter image description here

我有两个请求:

  1. 我想从 TABLE_1 中选择 CONSIGNMENT_NO 列中 TABLE_2 所没有的所有行,在本例中为 TABLE_1 第1列第5行
  2. 我想选择 DEMAN_DATE & MANIFEST_DATE 相等
  3. 我正在使用下面无法正常工作的代码:

    select distinct consignment_no from table_1 a
    where not exists (select  b.consignment_no from table_2 b where trunc(a.deman_date)='&dat' and trunc(b.manifest_date)='&dat')
    

3 个答案:

答案 0 :(得分:0)

WITH t
       AS (SELECT   *
             FROM   tbl1
            WHERE   consignment_no NOT IN (SELECT   consignment_no FROM tbl2))
SELECT   tbl2.*
  FROM   t, tbl2
 WHERE   t.deman_date = tbl2.manifest_date;

这是创建表语句的全部内容....

CREATE TABLE tbl1
AS
   SELECT   501000000 AS consignment_no,
            TO_DATE ('15/11/2015', 'dd/mm/yyyy') AS deman_date
     FROM   DUAL
   UNION ALL
   SELECT   501000000, TO_DATE ('15/11/2015', 'dd/mm/yyyy') FROM DUAL
   UNION ALL
   SELECT   501000000, TO_DATE ('15/11/2015', 'dd/mm/yyyy') FROM DUAL
   UNION ALL
   SELECT   501000001, TO_DATE ('16/11/2015', 'dd/mm/yyyy') FROM DUAL
   UNION ALL
   SELECT   501000002, TO_DATE ('16/11/2015', 'dd/mm/yyyy') FROM DUAL;

CREATE TABLE tbl2
AS
   SELECT   501000000 AS consignment_no,
            TO_DATE ('15/11/2015', 'dd/mm/yyyy') AS manifest_date
     FROM   DUAL
   UNION ALL
   SELECT   501000001, TO_DATE ('16/11/2015', 'dd/mm/yyyy') FROM DUAL;

WITH t
       AS (SELECT   *
             FROM   tbl1
            WHERE   consignment_no NOT IN (SELECT   consignment_no FROM tbl2))
SELECT   tbl2.*
  FROM   t, tbl2
 WHERE   t.deman_date = tbl2.manifest_date;

答案 1 :(得分:0)

也许我不理解你的问题,但是:

从table_1减去table_2

中选择*

- 如果你想要distict值

从table_1减去table_2

中选择distinct *

- 如果需要,您可以只选择一列

答案 2 :(得分:0)

对于1,您可以使用外部联接执行此操作,并返回表2返回null的那些。

对于2,我认为这是您想要的单独查询。为此,一个简单的内连接将起作用。

如果这不是您想要的单独查询,那么这是相互矛盾的,您将永远不会返回任何行。如果您最初开始使用的是表1中表2中的所有行,则表2中没有匹配的行。

相关问题