【问题标题】:PL Sql select column values where it doesnt exist in another tablePL Sql选择另一个表中不存在的列值
【发布时间】:2015-11-17 03:29:38
【问题描述】:

我在 Oracle 中有以下两个表。

我有两个请求:

  1. 我想从 TABLE_1 中的 CONSIGNMENT_NO 列中选择 TABLE_2 没有的所有行,在本例中为 TABLE_1第 1 列第 5 行
  2. 我想选择上面所有 DEMAN_DATEMANIFEST_DATE 相等的行

我正在使用以下无法正常工作的代码:

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')

【问题讨论】:

  • 除非我读错了,否则您的要求会相互冲突。您希望表 1 中的记录不会出现在表 2 中。在这种情况下,您将如何遇到 deman_date = manifest date 的条件?

标签: sql oracle


【解决方案1】:
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;

【讨论】:

  • 我非常喜欢使用 With T 来制作内联视图
【解决方案2】:

也许我没听懂你的问题,但是:

从 table_1 减去 table_2 中选择 *

--如果你想要不同的值

从 table_1 减去 table_2 中选择不同的 *

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

【讨论】:

    【解决方案3】:

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

    对于 2,我假设这是您想要的单独查询。为此,可以使用简单的内部连接。

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

    【讨论】:

    • 对于2,其实不是单独的查询,为了便于理解我把它分开了。
    • 那么你的要求没有意义。他们矛盾。你不能在一个查询中得到它。请阅读我回复的最后一段。
    猜你喜欢
    • 2018-11-16
    • 2011-02-27
    • 2017-11-13
    • 2012-01-30
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多