【问题标题】:How to append column value from one table to another table based on the primary key如何根据主键将列值从一个表附加到另一个表
【发布时间】:2021-12-27 07:22:19
【问题描述】:
CREATE TABLE tab_risk (
    prod_id      NUMBER(10),
    prod_name    VARCHAR2(30),
    prod_filter  VARCHAR2(30),
    constraint pk_tab_risk primary key (prod_id)
);

insert into tab_risk values(1,'a','Falcon');
insert into tab_risk values(2,'b','Cars');
insert into tab_risk values(3,'c','Powerpoint');
insert into tab_risk values(4,'d','Zone');

CREATE TABLE ref_filter (
    add_in_filter VARCHAR2(30)
);

insert into ref_filter values('Powerpoint');
insert into ref_filter values('Word');
insert into ref_filter values('Email');

我需要将 ref_filter 数据附加到特定的 prod_id。但我想知道如何做到这一点,或者这是否可能?就像目前的 prod_id 1 一样,prod_filter 是“Falcon”,但是当我选择时

prod_id 1 它应该给我“Falcon”、“Powerpoint”、“Word”和“Email”。同样适用于 prod_id 2 等等。有什么方法可以实现吗?

【问题讨论】:

  • 附带说明:tab_risk 是主键为 prod_id 的表的一个奇怪名称。如果这是一张风险表,我不会期望表中有产品而是风险,如果是产品表,我不会称之为风险。您可能需要更改此设置,以便拥有一个名称一致且易于理解的数据库。

标签: sql oracle plsql


【解决方案1】:

一种选择是创建一个视图并从中选择(而不是从表格中):

SQL> create or replace view v_filter as
  2  select r.prod_id, r.prod_filter
  3  from tab_risk r
  4  union
  5  select r.prod_id, f.add_in_filter
  6  from tab_risk r cross join ref_filter f;

View created.

SQL> select *
  2  from v_filter
  3  where prod_id = 1;

   PROD_ID PROD_FILTER
---------- ------------------------------
         1 Email
         1 Falcon
         1 Powerpoint
         1 Word

SQL>

然后可以将视图连接到tab_risk 表以选择其他列(如果需要)。


[编辑:这是您作为评论发布的查询,已修复]

SQL> SELECT r.prod_id, r.prod_name, r.prod_filter
  2    FROM tab_risk r
  3  UNION
  4  SELECT r.prod_id, r.prod_name, f.add_in_filter
  5    FROM tab_risk r CROSS JOIN ref_filter f;

   PROD_ID PROD_NAME                      PROD_FILTER
---------- ------------------------------ ------------------------------
         1 a                              Email
         1 a                              Falcon
         1 a                              Powerpoint
         1 a                              Word
         2 b                              Cars
         2 b                              Email
         2 b                              Powerpoint
         2 b                              Word
         3 c                              Email
         3 c                              Powerpoint
         3 c                              Word
         4 d                              Email
         4 d                              Powerpoint
         4 d                              Word
         4 d                              Zone

15 rows selected.

SQL>

【讨论】:

  • ... 或者您只需将其他列(目前仅name)添加到您视图中的查询中。
  • @Littlefoot 当我在视图中选择其他列时,它给了我一个错误。假设我想从 tab_risk 表中选择所有列,但它给出错误 select r.prod_id, r.prod_name,r.prod_filter from tab_risk r union select r.prod_id,r.prod_name f.add_in_filter from tab_risk r cross join ref_filter f ;
  • 哪个错误?您在评论中发布的代码包含易于修复的语法错误(缺少逗号)。
  • @Littlefoot 查询块的结果列数不正确这是修正逗号后的错误
  • 不,它没有不正确的列数如果已修复。请参阅编辑后的答案。
猜你喜欢
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多