【问题标题】:Oracle create view from two tablesOracle 从两个表创建视图
【发布时间】:2016-10-08 06:58:10
【问题描述】:

我在 Oracle 11g 中有以下表格:

表 A

SITE_ID       SITE_NAME        VECTOR       .........MANY OTHER FIELDS

BN9032U850    REY DEL MAR      ENSENADA
BS2362U850    COSTA BAJA       LA PAZ
BS2601U850    LA PAZ           LA PAZ
BS2606U850    CONQUISTADORES   LA PAZ
BN2679U850    COAST CAST       TIJUANA
BN7116U850    PALACIO AZTECA   TIJUANA

表 B

SITE_ID       SITE_NAME             VECTOR       .........MANY OTHER FIELDS

BN9032        REY DEL MAR           (null)
BN9033        BRISAS DEL MAR        (null)
BS2601        CUMBRES DE LA PRESA   (null)
BN9038G850    REAL DEL CASTILLO     (null)
BS0014G850    SAN BRUNO             (null)

正如您在两个表中看到的,还有许多其他字段,但我只对我写的那些(SITE_ID、SITE_NAME、VECTOR)感兴趣。

我想要实现的是创建一个包含这三列但包含两个表中的信息的视图。

但是这个视图必须满足这个条件:

  • 只注意两个表中 SITE_ID 字段的前 6 个字符。

例如,表 A 中的第一条记录的 SITE_ID 为“BN9032U850”,因此如果我们对前 6 个字符进行子串化,则生成的 SITE_ID 将为“BN9032”。但正如您所见,表 B 中的第一条记录具有相同的 SITE_ID,因此会有重复记录。

如果发生这种情况,要添加到视图中的记录必须是表 A 中的记录,而不是表 B 中的记录。最后我想实现这个输出:

查看输出

SITE_ID   SITE_NAME           VECTOR

BN9032    REY DEL MAR         ENSENADA    --->Table A
BS2362    COSTA BAJA          LA PAZ      --->Table A
BS2601    LA PAZ              LA PAZ      --->Table A
BS2606    CONQUISTADORES      LA PAZ      --->Table A
BN2679    COAST CAST          TIJUANA     --->Table A
BN7116    PALACIO AZTECA      TIJUANA     --->Table A
BN9033    BRISAS DEL MAR      (null)      --->Table B
BN9038    REAL DEL CASTILLO   (null)      --->Table B
BS0014    SAN BRUNO           (null)      --->Table B

我一直在处理这句话,但似乎有问题。

SELECT SUBSTR(SITE_ID,1,6) SITE_ID,SITE_NAME, VECTOR FROM TABLE_A
WHERE(SUBSTR(SITE_ID,1,6)) NOT IN
(SELECT SUBSTR(SITE_ID,1,6) FROM TABLE_B)
UNION
SELECT SUBSTR(SITE_ID,1,6) SITE_ID,SITE_NAME, VECTOR FROM TABLE_B
WHERE(SUBSTR(SITE_ID,1,6)) NOT IN
(SELECT SUBSTR(SITE_ID,1,6) FROM TABLE_A);

我希望你能帮助我一些示例代码开始。

【问题讨论】:

    标签: oracle view


    【解决方案1】:

    你的 UNION 的前半部分不需要 NOT IN 子句:

    SELECT SUBSTR(SITE_ID,1,6) SITE_ID,SITE_NAME, VECTOR
      FROM TABLE_A
    UNION
    SELECT SUBSTR(SITE_ID,1,6) SITE_ID,SITE_NAME, VECTOR
      FROM TABLE_B
     WHERE(SUBSTR(SITE_ID,1,6)) NOT IN (SELECT SUBSTR(SITE_ID,1,6) FROM TABLE_A);
    

    Table_A 中的所有内容以及 Table_B 中未在 Table_A 中找到的那些行。

    【讨论】:

      【解决方案2】:

      因为您想要 table_A 中的所有内容,但不在 table_B 中,我将在第二个条件中使用连接。您应该在两个表上的 substr(site_id,1,6) 上都有一个功能索引,如果可能的话是唯一的,以加快速度。

      这在功能上类似于Jonathan Leffler's answer,但它更明确地表明,如果您从此视图中选择所有内容,那么您将进行全扫描和全索引扫描table_A - 假设建议的索引已到位。它还更明确地表明,如果您进入索引,那么您只会对两个表进行索引范围/唯一扫描。

      select substr(site_id,1,6), as site_id ,site_name, vector
        from table_a
       union
      select substr(site_id,1,6), as site_id ,site_name, vector
        from table_b b
        left outer join table_a a
          on substr(b.site_id,1,6) = substr(a.site_id,1,6)
       where a.site_id is null
      

      【讨论】:

        猜你喜欢
        • 2018-07-24
        • 1970-01-01
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-03
        相关资源
        最近更新 更多