代码之家  ›  专栏  ›  技术社区  ›  Vicky

如何将ID列表放入单独的列中

  •  0
  • Vicky  · 技术社区  · 4 年前
    CREATE TABLE master_tab (
        e_id      NUMBER(10),
        owner_id  NUMBER(10),
        CONSTRAINT pk_master_tab PRIMARY KEY(e_id)
    );
    
    CREATE TABLE transaction_tab (
        e_id      NUMBER(10),
        analysis_comp  NUMBER(10),
        CONSTRAINT fk_master_tab FOREIGN KEY(e_id) REFERENCES master_tab(e_id)
    );
    
    INSERT INTO master_tab VALUES(1,72);
    INSERT INTO master_tab VALUES(2,72);
    INSERT INTO master_tab VALUES(3,73);
    INSERT INTO master_tab VALUES(4,null);
    
    INSERT INTO transaction_tab VALUES(1,1);
    INSERT INTO transaction_tab VALUES(2,1);
    INSERT INTO transaction_tab VALUES(3,1);
    INSERT INTO transaction_tab VALUES(4,1);
    
    

    问题陈述: 我有一张桌子 master_tab 由两列组成 e_id owner_id 。我想列出属于 owner\u id 72和73。还有一个条件 analysis_comp 表中的标志应为1 transaction_tab

    我的尝试:

    WITH a AS(
    SELECT mt.e_id FROM master_tab mt
    JOIN transaction_tab tt ON(tt.e_id = mt.e_id AND tt.analysis_comp = 1)
    WHERE mt.owner_id = 72
    ),
    b AS(
    SELECT mt.e_id FROM master_tab mt
    JOIN transaction_tab tt ON(tt.e_id = mt.e_id AND tt.analysis_comp = 1)
    WHERE mt.owner_id = 73
    )
    SELECT a.e_id a_eid,b.e_id b_eid FROM a
    FULL OUTER JOIN b ON(b.e_id = a.e_id);
    

    使用的工具:SQL Developer(18c)

    电流输出:

    +-------+-------+
    | A_EID | B_EID |
    +-------+-------+
    | 1     | null  |
    | 2     | null  |
    | null  | 3     |
    +-------+-------+
    

    预期输出:

    +-------+-------+
    | A_EID | B_EID |
    +-------+-------+
    |     1 |     3 |
    |     2 |       |
    +-------+-------+
    

    是否可以仅获取 e\u id 什么时候 owner\u id 如果是72,那么在第一行中,它应该给出所有者id为72的所有e\U id列表,同样,如果所有者id为73,那么它应该在另一列中提供一个单独的e\U id列表? 如果我使用连接条件,它将仅限于owner\u id 72。如果我们需要同一个表中不同列中的ID列表,有没有其他方法来处理这种情况

    1 回复  |  直到 4 年前
        1
  •  0
  •   Fat P    4 年前

    @Vicky,这个版本是根据您的查询修改的,可能对您更合适。

    WITH a AS(
    SELECT mt.e_id, rownum r FROM master_tab mt
    JOIN transaction_tab tt ON(tt.e_id = mt.e_id AND tt.analysis_comp = 1)
    WHERE mt.owner_id = 72
    ),
    b AS(
    SELECT mt.e_id, rownum r FROM master_tab mt
    JOIN transaction_tab tt ON(tt.e_id = mt.e_id AND tt.analysis_comp = 1)
    WHERE mt.owner_id = 73
    )
    SELECT a.e_id a_eid, b.e_id b_eid from a full outer join b
    on a.r=b.r ;
    

    使用的此版本 ROWNUM 对于每个子查询,然后逐行匹配这两列。

    为什么我们使用 row_number / rownum ?因为您正在使用行号连接这两列。

    在SQL(或任何基于表的输出)中,通常期望行中的数据彼此相关。您的演示可能会让习惯于此的人感到困惑。为什么不单独输出?