【问题标题】:Selecting an out-of-range date, column name, and timestamp from multiple tables从多个表中选择超出范围的日期、列名和时间戳
【发布时间】:2018-03-30 20:00:43
【问题描述】:

我有多个表 (10+),我试图在其中提取指定日期范围之外的任何日期、列名(包含超出范围的日期)以及该日期行的 MODIFIED_BY。下面是两个示例表和所需的输出。 我在表 A 中检查的日期范围是大于 1990 年的出生日期。在表 B 中,生效日期大于 2017 年

TABLE_A

|---------------------|------------------|------------------|
|      ACCT_ID        |    BIRTHDATE     |    MODIFIED_BY   |
|---------------------|------------------|------------------|
|          12         |     04-MAR-96    |     user1234     |
|---------------------|------------------|------------------|
|          13         |     10-MAY-79    |     user9999     |
|---------------------|------------------|------------------|

TABLE_B

|---------------------|------------------|------------------|
|      ACCT_ID        |   EFFECTIVE_DT   |    MODIFIED_BY   |
|---------------------|------------------|------------------|
|          12         |     01-JAN-15    |     user9876     |
|---------------------|------------------|------------------|
|          13         |     01-APR-17    |     user1111     |
|---------------------|------------------|------------------|

输出

|---------------------|------------------|------------------|
|      ACCT_ID        |     BAD_DATE     |    MODIFIED_BY   |
|---------------------|------------------|------------------|
|          12         |     04-MAR-96    |     user1234     |
|---------------------|------------------|------------------|
|          13         |     01-APR-17    |     user1111     |
|---------------------|------------------|------------------|

我不是在寻找这个实例中的 SQL 代码,而是一个解决方案。我可能可以使用 UNION 完成此操作,但由于并非所有连接都在 acct_id 上,因此在为许多表执行此操作时可能会很乏味且速度很慢。我能够使用两列来完成此操作,一列是帐户 ID,另一列是 BAD_DATE,在其中我将列名和 modified_by 附加到案例返回。

感谢任何帮助。

谢谢!

【问题讨论】:

  • 友情提示:校对您发布的内容。您写道:“和那个日期的行” 日期行的 what?我应该阅读您的帖子的其余部分,也许我能够弄清楚吗?

标签: sql oracle multiple-columns


【解决方案1】:

如果不对这些表进行联合,我不知道该怎么做;可能是一项乏味的工作,但是嘿 - 你只会做一次。这是一个例子:

SQL> create table table_a (acct_id number, birthdate date, modified_by varchar2(20));

Table created.

SQL> create table table_b (some_id number, effective_dt date, username varchar2(20));

Table created.

SQL> insert all
  2    into table_a values (12, date '1996-03-04', 'user1234')
  3    into table_a values (13, date '1979-05-10', 'user9999')
  4    into table_b values (12, date '2015-01-01', 'user9876')
  5    into table_b values (12, date '2017-04-01', 'user1111')
  6  select * From dual;

4 rows created.

SQL> create or replace view wc as
  2  select 'table_a' source, acct_id id, birthdate bad_date, modified_by from table_a union all
  3  select 'table_b' source, some_id, effective_dt, username from table_b;

View created.

SQL>
SQL> select *
  2  from wc
  3  where (source = 'table_a' and bad_date > date '1990-01-01')
  4     or (source = 'table_b' and bad_date > date '2017-01-01');

SOURCE          ID BAD_DATE   MODIFIED_BY
------- ---------- ---------- --------------------
table_a         12 04.03.1996 user1234
table_b         12 01.04.2017 user1111

SQL>

【讨论】:

    【解决方案2】:

    找到了解决办法!

    我正在使用 case 语句来确定错误的日期。如果我添加两个具有相同条件的附加 case 语句,但一个返回列名字符串,另一个返回 modified_by ID,它就可以工作!

    【讨论】:

    • 我不确定我是否理解你在说什么(即举个例子会有所帮助),但是 - 如果你说它有效,我能说什么呢?再好不过了!
    猜你喜欢
    • 2011-11-16
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多