Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅限Oracle SQL:用于根据条件显示结果的Case语句或exists查询_Sql_Oracle_Case Statement - Fatal编程技术网

仅限Oracle SQL:用于根据条件显示结果的Case语句或exists查询

仅限Oracle SQL:用于根据条件显示结果的Case语句或exists查询,sql,oracle,case-statement,Sql,Oracle,Case Statement,我试图使用case语句根据一些条件创建计算列。我离目标很近,但看不出问题出在哪里。希望我在这里得到一些最好/更简单的方法和帮助 下表为: 人员表: +----+--------+ | ID | PERSON | +----+--------+ | 1 | John | | 2 | Scott | | 3 | Ruth | | 4 | Smith | | 5 | Frank | | 6 | Martin | | 7 | Blake | +----+--------+

我试图使用case语句根据一些条件创建计算列。我离目标很近,但看不出问题出在哪里。希望我在这里得到一些最好/更简单的方法和帮助

下表为:
人员表:

+----+--------+
| ID | PERSON |
+----+--------+
|  1 | John   |
|  2 | Scott  |
|  3 | Ruth   |
|  4 | Smith  |
|  5 | Frank  |
|  6 | Martin |
|  7 | Blake  |
+----+--------+
+----+------+
| ID | ROLE |
+----+------+
|  1 | JJJ  |
|  2 | Auth |
|  3 | AAA  |
|  4 | MMM  |
|  5 | KKK  |
|  6 | BBB  |
+----+------+
+----+-----------+---------+
| ID | PERSON_ID | ROLE_ID |
+----+-----------+---------+
|  1 |         1 |       1 |
|  2 |         2 |       2 |
|  3 |         2 |       3 |
|  4 |         2 |       4 |
|  5 |         3 |       1 |
|  6 |         3 |       5 |
|  7 |         4 |       3 |
|  8 |         5 |       6 |
|  9 |         6 |       3 |
| 10 |         6 |       6 |
| 11 |         6 |       2 |
| 12 |         7 |       5 |
| 13 |         7 |       6 |
+----+-----------+---------+
+--------+--------+----------+
| PERSON | MYROLE | MYACCESS |
+--------+--------+----------+
| John   | JJJ    |          |
| Scott  | Auth   | Remove   |
| Scott  | AAA    |          |
| Scott  | MMM    |          |
| Ruth   | JJJ    |          |
| Ruth   | KKK    |          |
| Smith  | AAA    | Add      |
| Frank  | BBB    | Add      |
| Martin | AAA    |          |
| Martin | BBB    |          |
| Martin | Auth   | Remove   |
| Blake  | KKK    |          |
| Blake  | BBB    | Add      |
+--------+--------+----------+
+--------+--------+----------+
| PERSON | MYROLE | MYACCESS |
+--------+--------+----------+
| Blake  | KKK    |          |
| Blake  | BBB    | Add      |
| Frank  | BBB    | Add      |
| John   | JJJ    |          |
| Martin | AUTH   | Remove   |
| Martin | BBB    | Add      |
| Martin | AAA    | Add      |
| Ruth   | JJJ    |          |
| Ruth   | KKK    |          |
| Scott  | AAA    | Add      |
| Scott  | AUTH   | Remove   |
| Scott  | MMM    |          |
| Smith  | AAA    | Add      |
+--------+--------+----------+
CREATE TABLE person (
    id      INTEGER NOT NULL,
    person  VARCHAR2(50 CHAR)
);

INSERT INTO person (
    id,
    person
) VALUES (
    1,
    'John'
);

INSERT INTO person (
    id,
    person
) VALUES (
    2,
    'Scott'
);

INSERT INTO person (
    id,
    person
) VALUES (
    3,
    'Ruth'
);

INSERT INTO person (
    id,
    person
) VALUES (
    4,
    'Smith'
);

INSERT INTO person (
    id,
    person
) VALUES (
    5,
    'Frank'
);

INSERT INTO person (
    id,
    person
) VALUES (
    6,
    'Martin'
);

INSERT INTO person (
    id,
    person
) VALUES (
    7,
    'Blake'
);

ALTER TABLE person ADD CONSTRAINT person_pk PRIMARY KEY ( id );


CREATE TABLE myrole (
    id    INTEGER NOT NULL,
    role  VARCHAR2(50 CHAR)
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    1,
    'JJJ'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    2,
    'Auth'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    3,
    'AAA'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    4,
    'MMM'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    5,
    'KKK'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    6,
    'BBB'
);

ALTER TABLE myrole ADD CONSTRAINT myrole_pk PRIMARY KEY ( id );


CREATE TABLE person_role (
    id         INTEGER NOT NULL,
    person_id  INTEGER,
    myrole_id  INTEGER
);

ALTER TABLE person_role ADD CONSTRAINT person_role_pk PRIMARY KEY ( id );

CREATE SEQUENCE myrole_seq START WITH 1 NOCACHE;

CREATE OR REPLACE TRIGGER myrole_tr BEFORE
    INSERT ON myrole
    FOR EACH ROW
    WHEN ( new.id IS NULL )
BEGIN
    :new.id := myrole_seq.nextval;
END;
/

CREATE SEQUENCE person_seq START WITH 1 NOCACHE;

CREATE OR REPLACE TRIGGER person_tr BEFORE
    INSERT ON person
    FOR EACH ROW
    WHEN ( new.id IS NULL )
BEGIN
    :new.id := person_seq.nextval;
END;
/

CREATE SEQUENCE person_role_seq START WITH 1 NOCACHE;

CREATE OR REPLACE TRIGGER person_role_tr BEFORE
    INSERT ON person_role
    FOR EACH ROW
    WHEN ( new.id IS NULL )
BEGIN
    :new.id := person_role_seq.nextval;
END;
/
角色表:

+----+--------+
| ID | PERSON |
+----+--------+
|  1 | John   |
|  2 | Scott  |
|  3 | Ruth   |
|  4 | Smith  |
|  5 | Frank  |
|  6 | Martin |
|  7 | Blake  |
+----+--------+
+----+------+
| ID | ROLE |
+----+------+
|  1 | JJJ  |
|  2 | Auth |
|  3 | AAA  |
|  4 | MMM  |
|  5 | KKK  |
|  6 | BBB  |
+----+------+
+----+-----------+---------+
| ID | PERSON_ID | ROLE_ID |
+----+-----------+---------+
|  1 |         1 |       1 |
|  2 |         2 |       2 |
|  3 |         2 |       3 |
|  4 |         2 |       4 |
|  5 |         3 |       1 |
|  6 |         3 |       5 |
|  7 |         4 |       3 |
|  8 |         5 |       6 |
|  9 |         6 |       3 |
| 10 |         6 |       6 |
| 11 |         6 |       2 |
| 12 |         7 |       5 |
| 13 |         7 |       6 |
+----+-----------+---------+
+--------+--------+----------+
| PERSON | MYROLE | MYACCESS |
+--------+--------+----------+
| John   | JJJ    |          |
| Scott  | Auth   | Remove   |
| Scott  | AAA    |          |
| Scott  | MMM    |          |
| Ruth   | JJJ    |          |
| Ruth   | KKK    |          |
| Smith  | AAA    | Add      |
| Frank  | BBB    | Add      |
| Martin | AAA    |          |
| Martin | BBB    |          |
| Martin | Auth   | Remove   |
| Blake  | KKK    |          |
| Blake  | BBB    | Add      |
+--------+--------+----------+
+--------+--------+----------+
| PERSON | MYROLE | MYACCESS |
+--------+--------+----------+
| Blake  | KKK    |          |
| Blake  | BBB    | Add      |
| Frank  | BBB    | Add      |
| John   | JJJ    |          |
| Martin | AUTH   | Remove   |
| Martin | BBB    | Add      |
| Martin | AAA    | Add      |
| Ruth   | JJJ    |          |
| Ruth   | KKK    |          |
| Scott  | AAA    | Add      |
| Scott  | AUTH   | Remove   |
| Scott  | MMM    |          |
| Smith  | AAA    | Add      |
+--------+--------+----------+
CREATE TABLE person (
    id      INTEGER NOT NULL,
    person  VARCHAR2(50 CHAR)
);

INSERT INTO person (
    id,
    person
) VALUES (
    1,
    'John'
);

INSERT INTO person (
    id,
    person
) VALUES (
    2,
    'Scott'
);

INSERT INTO person (
    id,
    person
) VALUES (
    3,
    'Ruth'
);

INSERT INTO person (
    id,
    person
) VALUES (
    4,
    'Smith'
);

INSERT INTO person (
    id,
    person
) VALUES (
    5,
    'Frank'
);

INSERT INTO person (
    id,
    person
) VALUES (
    6,
    'Martin'
);

INSERT INTO person (
    id,
    person
) VALUES (
    7,
    'Blake'
);

ALTER TABLE person ADD CONSTRAINT person_pk PRIMARY KEY ( id );


CREATE TABLE myrole (
    id    INTEGER NOT NULL,
    role  VARCHAR2(50 CHAR)
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    1,
    'JJJ'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    2,
    'Auth'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    3,
    'AAA'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    4,
    'MMM'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    5,
    'KKK'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    6,
    'BBB'
);

ALTER TABLE myrole ADD CONSTRAINT myrole_pk PRIMARY KEY ( id );


CREATE TABLE person_role (
    id         INTEGER NOT NULL,
    person_id  INTEGER,
    myrole_id  INTEGER
);

ALTER TABLE person_role ADD CONSTRAINT person_role_pk PRIMARY KEY ( id );

CREATE SEQUENCE myrole_seq START WITH 1 NOCACHE;

CREATE OR REPLACE TRIGGER myrole_tr BEFORE
    INSERT ON myrole
    FOR EACH ROW
    WHEN ( new.id IS NULL )
BEGIN
    :new.id := myrole_seq.nextval;
END;
/

CREATE SEQUENCE person_seq START WITH 1 NOCACHE;

CREATE OR REPLACE TRIGGER person_tr BEFORE
    INSERT ON person
    FOR EACH ROW
    WHEN ( new.id IS NULL )
BEGIN
    :new.id := person_seq.nextval;
END;
/

CREATE SEQUENCE person_role_seq START WITH 1 NOCACHE;

CREATE OR REPLACE TRIGGER person_role_tr BEFORE
    INSERT ON person_role
    FOR EACH ROW
    WHEN ( new.id IS NULL )
BEGIN
    :new.id := person_role_seq.nextval;
END;
/
最后一个是明细表
人员角色表:

+----+--------+
| ID | PERSON |
+----+--------+
|  1 | John   |
|  2 | Scott  |
|  3 | Ruth   |
|  4 | Smith  |
|  5 | Frank  |
|  6 | Martin |
|  7 | Blake  |
+----+--------+
+----+------+
| ID | ROLE |
+----+------+
|  1 | JJJ  |
|  2 | Auth |
|  3 | AAA  |
|  4 | MMM  |
|  5 | KKK  |
|  6 | BBB  |
+----+------+
+----+-----------+---------+
| ID | PERSON_ID | ROLE_ID |
+----+-----------+---------+
|  1 |         1 |       1 |
|  2 |         2 |       2 |
|  3 |         2 |       3 |
|  4 |         2 |       4 |
|  5 |         3 |       1 |
|  6 |         3 |       5 |
|  7 |         4 |       3 |
|  8 |         5 |       6 |
|  9 |         6 |       3 |
| 10 |         6 |       6 |
| 11 |         6 |       2 |
| 12 |         7 |       5 |
| 13 |         7 |       6 |
+----+-----------+---------+
+--------+--------+----------+
| PERSON | MYROLE | MYACCESS |
+--------+--------+----------+
| John   | JJJ    |          |
| Scott  | Auth   | Remove   |
| Scott  | AAA    |          |
| Scott  | MMM    |          |
| Ruth   | JJJ    |          |
| Ruth   | KKK    |          |
| Smith  | AAA    | Add      |
| Frank  | BBB    | Add      |
| Martin | AAA    |          |
| Martin | BBB    |          |
| Martin | Auth   | Remove   |
| Blake  | KKK    |          |
| Blake  | BBB    | Add      |
+--------+--------+----------+
+--------+--------+----------+
| PERSON | MYROLE | MYACCESS |
+--------+--------+----------+
| Blake  | KKK    |          |
| Blake  | BBB    | Add      |
| Frank  | BBB    | Add      |
| John   | JJJ    |          |
| Martin | AUTH   | Remove   |
| Martin | BBB    | Add      |
| Martin | AAA    | Add      |
| Ruth   | JJJ    |          |
| Ruth   | KKK    |          |
| Scott  | AAA    | Add      |
| Scott  | AUTH   | Remove   |
| Scott  | MMM    |          |
| Smith  | AAA    | Add      |
+--------+--------+----------+
CREATE TABLE person (
    id      INTEGER NOT NULL,
    person  VARCHAR2(50 CHAR)
);

INSERT INTO person (
    id,
    person
) VALUES (
    1,
    'John'
);

INSERT INTO person (
    id,
    person
) VALUES (
    2,
    'Scott'
);

INSERT INTO person (
    id,
    person
) VALUES (
    3,
    'Ruth'
);

INSERT INTO person (
    id,
    person
) VALUES (
    4,
    'Smith'
);

INSERT INTO person (
    id,
    person
) VALUES (
    5,
    'Frank'
);

INSERT INTO person (
    id,
    person
) VALUES (
    6,
    'Martin'
);

INSERT INTO person (
    id,
    person
) VALUES (
    7,
    'Blake'
);

ALTER TABLE person ADD CONSTRAINT person_pk PRIMARY KEY ( id );


CREATE TABLE myrole (
    id    INTEGER NOT NULL,
    role  VARCHAR2(50 CHAR)
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    1,
    'JJJ'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    2,
    'Auth'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    3,
    'AAA'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    4,
    'MMM'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    5,
    'KKK'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    6,
    'BBB'
);

ALTER TABLE myrole ADD CONSTRAINT myrole_pk PRIMARY KEY ( id );


CREATE TABLE person_role (
    id         INTEGER NOT NULL,
    person_id  INTEGER,
    myrole_id  INTEGER
);

ALTER TABLE person_role ADD CONSTRAINT person_role_pk PRIMARY KEY ( id );

CREATE SEQUENCE myrole_seq START WITH 1 NOCACHE;

CREATE OR REPLACE TRIGGER myrole_tr BEFORE
    INSERT ON myrole
    FOR EACH ROW
    WHEN ( new.id IS NULL )
BEGIN
    :new.id := myrole_seq.nextval;
END;
/

CREATE SEQUENCE person_seq START WITH 1 NOCACHE;

CREATE OR REPLACE TRIGGER person_tr BEFORE
    INSERT ON person
    FOR EACH ROW
    WHEN ( new.id IS NULL )
BEGIN
    :new.id := person_seq.nextval;
END;
/

CREATE SEQUENCE person_role_seq START WITH 1 NOCACHE;

CREATE OR REPLACE TRIGGER person_role_tr BEFORE
    INSERT ON person_role
    FOR EACH ROW
    WHEN ( new.id IS NULL )
BEGIN
    :new.id := person_role_seq.nextval;
END;
/
期望/预期输出:

+----+--------+
| ID | PERSON |
+----+--------+
|  1 | John   |
|  2 | Scott  |
|  3 | Ruth   |
|  4 | Smith  |
|  5 | Frank  |
|  6 | Martin |
|  7 | Blake  |
+----+--------+
+----+------+
| ID | ROLE |
+----+------+
|  1 | JJJ  |
|  2 | Auth |
|  3 | AAA  |
|  4 | MMM  |
|  5 | KKK  |
|  6 | BBB  |
+----+------+
+----+-----------+---------+
| ID | PERSON_ID | ROLE_ID |
+----+-----------+---------+
|  1 |         1 |       1 |
|  2 |         2 |       2 |
|  3 |         2 |       3 |
|  4 |         2 |       4 |
|  5 |         3 |       1 |
|  6 |         3 |       5 |
|  7 |         4 |       3 |
|  8 |         5 |       6 |
|  9 |         6 |       3 |
| 10 |         6 |       6 |
| 11 |         6 |       2 |
| 12 |         7 |       5 |
| 13 |         7 |       6 |
+----+-----------+---------+
+--------+--------+----------+
| PERSON | MYROLE | MYACCESS |
+--------+--------+----------+
| John   | JJJ    |          |
| Scott  | Auth   | Remove   |
| Scott  | AAA    |          |
| Scott  | MMM    |          |
| Ruth   | JJJ    |          |
| Ruth   | KKK    |          |
| Smith  | AAA    | Add      |
| Frank  | BBB    | Add      |
| Martin | AAA    |          |
| Martin | BBB    |          |
| Martin | Auth   | Remove   |
| Blake  | KKK    |          |
| Blake  | BBB    | Add      |
+--------+--------+----------+
+--------+--------+----------+
| PERSON | MYROLE | MYACCESS |
+--------+--------+----------+
| Blake  | KKK    |          |
| Blake  | BBB    | Add      |
| Frank  | BBB    | Add      |
| John   | JJJ    |          |
| Martin | AUTH   | Remove   |
| Martin | BBB    | Add      |
| Martin | AAA    | Add      |
| Ruth   | JJJ    |          |
| Ruth   | KKK    |          |
| Scott  | AAA    | Add      |
| Scott  | AUTH   | Remove   |
| Scott  | MMM    |          |
| Smith  | AAA    | Add      |
+--------+--------+----------+
CREATE TABLE person (
    id      INTEGER NOT NULL,
    person  VARCHAR2(50 CHAR)
);

INSERT INTO person (
    id,
    person
) VALUES (
    1,
    'John'
);

INSERT INTO person (
    id,
    person
) VALUES (
    2,
    'Scott'
);

INSERT INTO person (
    id,
    person
) VALUES (
    3,
    'Ruth'
);

INSERT INTO person (
    id,
    person
) VALUES (
    4,
    'Smith'
);

INSERT INTO person (
    id,
    person
) VALUES (
    5,
    'Frank'
);

INSERT INTO person (
    id,
    person
) VALUES (
    6,
    'Martin'
);

INSERT INTO person (
    id,
    person
) VALUES (
    7,
    'Blake'
);

ALTER TABLE person ADD CONSTRAINT person_pk PRIMARY KEY ( id );


CREATE TABLE myrole (
    id    INTEGER NOT NULL,
    role  VARCHAR2(50 CHAR)
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    1,
    'JJJ'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    2,
    'Auth'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    3,
    'AAA'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    4,
    'MMM'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    5,
    'KKK'
);

INSERT INTO myrole (
    id,
    role
) VALUES (
    6,
    'BBB'
);

ALTER TABLE myrole ADD CONSTRAINT myrole_pk PRIMARY KEY ( id );


CREATE TABLE person_role (
    id         INTEGER NOT NULL,
    person_id  INTEGER,
    myrole_id  INTEGER
);

ALTER TABLE person_role ADD CONSTRAINT person_role_pk PRIMARY KEY ( id );

CREATE SEQUENCE myrole_seq START WITH 1 NOCACHE;

CREATE OR REPLACE TRIGGER myrole_tr BEFORE
    INSERT ON myrole
    FOR EACH ROW
    WHEN ( new.id IS NULL )
BEGIN
    :new.id := myrole_seq.nextval;
END;
/

CREATE SEQUENCE person_seq START WITH 1 NOCACHE;

CREATE OR REPLACE TRIGGER person_tr BEFORE
    INSERT ON person
    FOR EACH ROW
    WHEN ( new.id IS NULL )
BEGIN
    :new.id := person_seq.nextval;
END;
/

CREATE SEQUENCE person_role_seq START WITH 1 NOCACHE;

CREATE OR REPLACE TRIGGER person_role_tr BEFORE
    INSERT ON person_role
    FOR EACH ROW
    WHEN ( new.id IS NULL )
BEGIN
    :new.id := person_role_seq.nextval;
END;
/
以下是条件:

  • 如果个人具有角色为“AAA”或“BBB”而非“Auth”,则MYAccess列应将该个人的值显示为“添加”。所有其他值都应为null
  • 如果Person具有角色“Auth”,则MYAccess列应仅显示该行的“Remove”。即使同一个人有“AAA”或“BBB”或任何其他值,它也应该显示null
  • 下面是我得到的部分正确的实际输出:

    +----+--------+
    | ID | PERSON |
    +----+--------+
    |  1 | John   |
    |  2 | Scott  |
    |  3 | Ruth   |
    |  4 | Smith  |
    |  5 | Frank  |
    |  6 | Martin |
    |  7 | Blake  |
    +----+--------+
    
    +----+------+
    | ID | ROLE |
    +----+------+
    |  1 | JJJ  |
    |  2 | Auth |
    |  3 | AAA  |
    |  4 | MMM  |
    |  5 | KKK  |
    |  6 | BBB  |
    +----+------+
    
    +----+-----------+---------+
    | ID | PERSON_ID | ROLE_ID |
    +----+-----------+---------+
    |  1 |         1 |       1 |
    |  2 |         2 |       2 |
    |  3 |         2 |       3 |
    |  4 |         2 |       4 |
    |  5 |         3 |       1 |
    |  6 |         3 |       5 |
    |  7 |         4 |       3 |
    |  8 |         5 |       6 |
    |  9 |         6 |       3 |
    | 10 |         6 |       6 |
    | 11 |         6 |       2 |
    | 12 |         7 |       5 |
    | 13 |         7 |       6 |
    +----+-----------+---------+
    
    +--------+--------+----------+
    | PERSON | MYROLE | MYACCESS |
    +--------+--------+----------+
    | John   | JJJ    |          |
    | Scott  | Auth   | Remove   |
    | Scott  | AAA    |          |
    | Scott  | MMM    |          |
    | Ruth   | JJJ    |          |
    | Ruth   | KKK    |          |
    | Smith  | AAA    | Add      |
    | Frank  | BBB    | Add      |
    | Martin | AAA    |          |
    | Martin | BBB    |          |
    | Martin | Auth   | Remove   |
    | Blake  | KKK    |          |
    | Blake  | BBB    | Add      |
    +--------+--------+----------+
    
    +--------+--------+----------+
    | PERSON | MYROLE | MYACCESS |
    +--------+--------+----------+
    | Blake  | KKK    |          |
    | Blake  | BBB    | Add      |
    | Frank  | BBB    | Add      |
    | John   | JJJ    |          |
    | Martin | AUTH   | Remove   |
    | Martin | BBB    | Add      |
    | Martin | AAA    | Add      |
    | Ruth   | JJJ    |          |
    | Ruth   | KKK    |          |
    | Scott  | AAA    | Add      |
    | Scott  | AUTH   | Remove   |
    | Scott  | MMM    |          |
    | Smith  | AAA    | Add      |
    +--------+--------+----------+
    
    CREATE TABLE person (
        id      INTEGER NOT NULL,
        person  VARCHAR2(50 CHAR)
    );
    
    INSERT INTO person (
        id,
        person
    ) VALUES (
        1,
        'John'
    );
    
    INSERT INTO person (
        id,
        person
    ) VALUES (
        2,
        'Scott'
    );
    
    INSERT INTO person (
        id,
        person
    ) VALUES (
        3,
        'Ruth'
    );
    
    INSERT INTO person (
        id,
        person
    ) VALUES (
        4,
        'Smith'
    );
    
    INSERT INTO person (
        id,
        person
    ) VALUES (
        5,
        'Frank'
    );
    
    INSERT INTO person (
        id,
        person
    ) VALUES (
        6,
        'Martin'
    );
    
    INSERT INTO person (
        id,
        person
    ) VALUES (
        7,
        'Blake'
    );
    
    ALTER TABLE person ADD CONSTRAINT person_pk PRIMARY KEY ( id );
    
    
    CREATE TABLE myrole (
        id    INTEGER NOT NULL,
        role  VARCHAR2(50 CHAR)
    );
    
    INSERT INTO myrole (
        id,
        role
    ) VALUES (
        1,
        'JJJ'
    );
    
    INSERT INTO myrole (
        id,
        role
    ) VALUES (
        2,
        'Auth'
    );
    
    INSERT INTO myrole (
        id,
        role
    ) VALUES (
        3,
        'AAA'
    );
    
    INSERT INTO myrole (
        id,
        role
    ) VALUES (
        4,
        'MMM'
    );
    
    INSERT INTO myrole (
        id,
        role
    ) VALUES (
        5,
        'KKK'
    );
    
    INSERT INTO myrole (
        id,
        role
    ) VALUES (
        6,
        'BBB'
    );
    
    ALTER TABLE myrole ADD CONSTRAINT myrole_pk PRIMARY KEY ( id );
    
    
    CREATE TABLE person_role (
        id         INTEGER NOT NULL,
        person_id  INTEGER,
        myrole_id  INTEGER
    );
    
    ALTER TABLE person_role ADD CONSTRAINT person_role_pk PRIMARY KEY ( id );
    
    CREATE SEQUENCE myrole_seq START WITH 1 NOCACHE;
    
    CREATE OR REPLACE TRIGGER myrole_tr BEFORE
        INSERT ON myrole
        FOR EACH ROW
        WHEN ( new.id IS NULL )
    BEGIN
        :new.id := myrole_seq.nextval;
    END;
    /
    
    CREATE SEQUENCE person_seq START WITH 1 NOCACHE;
    
    CREATE OR REPLACE TRIGGER person_tr BEFORE
        INSERT ON person
        FOR EACH ROW
        WHEN ( new.id IS NULL )
    BEGIN
        :new.id := person_seq.nextval;
    END;
    /
    
    CREATE SEQUENCE person_role_seq START WITH 1 NOCACHE;
    
    CREATE OR REPLACE TRIGGER person_role_tr BEFORE
        INSERT ON person_role
        FOR EACH ROW
        WHEN ( new.id IS NULL )
    BEGIN
        :new.id := person_role_seq.nextval;
    END;
    /
    
    对于Martin和Scott,应该只显示“Remove”,但我也会看到“Add”

    以下是查询:

    SELECT p.person,upper(r.role) myrole,
    case when p.person in (select p.person from  person ut where ut.person = p.person and upper(r.role) = upper('Auth')) then 'Remove' 
         when p.person in (select p.person from  person ut where ut.person = p.person and (upper(r.role) = upper('Auth') or (upper(r.role) = upper('AAA') or upper(r.role) = upper('BBB')))) then 'Add' else null
    end as myaccess
    FROM person p
           join person_role pr
             ON p.id = pr.person_id
           join myrole r
             ON r.id = pr.role_id
    order by p.person
    
    DDL脚本:

    +----+--------+
    | ID | PERSON |
    +----+--------+
    |  1 | John   |
    |  2 | Scott  |
    |  3 | Ruth   |
    |  4 | Smith  |
    |  5 | Frank  |
    |  6 | Martin |
    |  7 | Blake  |
    +----+--------+
    
    +----+------+
    | ID | ROLE |
    +----+------+
    |  1 | JJJ  |
    |  2 | Auth |
    |  3 | AAA  |
    |  4 | MMM  |
    |  5 | KKK  |
    |  6 | BBB  |
    +----+------+
    
    +----+-----------+---------+
    | ID | PERSON_ID | ROLE_ID |
    +----+-----------+---------+
    |  1 |         1 |       1 |
    |  2 |         2 |       2 |
    |  3 |         2 |       3 |
    |  4 |         2 |       4 |
    |  5 |         3 |       1 |
    |  6 |         3 |       5 |
    |  7 |         4 |       3 |
    |  8 |         5 |       6 |
    |  9 |         6 |       3 |
    | 10 |         6 |       6 |
    | 11 |         6 |       2 |
    | 12 |         7 |       5 |
    | 13 |         7 |       6 |
    +----+-----------+---------+
    
    +--------+--------+----------+
    | PERSON | MYROLE | MYACCESS |
    +--------+--------+----------+
    | John   | JJJ    |          |
    | Scott  | Auth   | Remove   |
    | Scott  | AAA    |          |
    | Scott  | MMM    |          |
    | Ruth   | JJJ    |          |
    | Ruth   | KKK    |          |
    | Smith  | AAA    | Add      |
    | Frank  | BBB    | Add      |
    | Martin | AAA    |          |
    | Martin | BBB    |          |
    | Martin | Auth   | Remove   |
    | Blake  | KKK    |          |
    | Blake  | BBB    | Add      |
    +--------+--------+----------+
    
    +--------+--------+----------+
    | PERSON | MYROLE | MYACCESS |
    +--------+--------+----------+
    | Blake  | KKK    |          |
    | Blake  | BBB    | Add      |
    | Frank  | BBB    | Add      |
    | John   | JJJ    |          |
    | Martin | AUTH   | Remove   |
    | Martin | BBB    | Add      |
    | Martin | AAA    | Add      |
    | Ruth   | JJJ    |          |
    | Ruth   | KKK    |          |
    | Scott  | AAA    | Add      |
    | Scott  | AUTH   | Remove   |
    | Scott  | MMM    |          |
    | Smith  | AAA    | Add      |
    +--------+--------+----------+
    
    CREATE TABLE person (
        id      INTEGER NOT NULL,
        person  VARCHAR2(50 CHAR)
    );
    
    INSERT INTO person (
        id,
        person
    ) VALUES (
        1,
        'John'
    );
    
    INSERT INTO person (
        id,
        person
    ) VALUES (
        2,
        'Scott'
    );
    
    INSERT INTO person (
        id,
        person
    ) VALUES (
        3,
        'Ruth'
    );
    
    INSERT INTO person (
        id,
        person
    ) VALUES (
        4,
        'Smith'
    );
    
    INSERT INTO person (
        id,
        person
    ) VALUES (
        5,
        'Frank'
    );
    
    INSERT INTO person (
        id,
        person
    ) VALUES (
        6,
        'Martin'
    );
    
    INSERT INTO person (
        id,
        person
    ) VALUES (
        7,
        'Blake'
    );
    
    ALTER TABLE person ADD CONSTRAINT person_pk PRIMARY KEY ( id );
    
    
    CREATE TABLE myrole (
        id    INTEGER NOT NULL,
        role  VARCHAR2(50 CHAR)
    );
    
    INSERT INTO myrole (
        id,
        role
    ) VALUES (
        1,
        'JJJ'
    );
    
    INSERT INTO myrole (
        id,
        role
    ) VALUES (
        2,
        'Auth'
    );
    
    INSERT INTO myrole (
        id,
        role
    ) VALUES (
        3,
        'AAA'
    );
    
    INSERT INTO myrole (
        id,
        role
    ) VALUES (
        4,
        'MMM'
    );
    
    INSERT INTO myrole (
        id,
        role
    ) VALUES (
        5,
        'KKK'
    );
    
    INSERT INTO myrole (
        id,
        role
    ) VALUES (
        6,
        'BBB'
    );
    
    ALTER TABLE myrole ADD CONSTRAINT myrole_pk PRIMARY KEY ( id );
    
    
    CREATE TABLE person_role (
        id         INTEGER NOT NULL,
        person_id  INTEGER,
        myrole_id  INTEGER
    );
    
    ALTER TABLE person_role ADD CONSTRAINT person_role_pk PRIMARY KEY ( id );
    
    CREATE SEQUENCE myrole_seq START WITH 1 NOCACHE;
    
    CREATE OR REPLACE TRIGGER myrole_tr BEFORE
        INSERT ON myrole
        FOR EACH ROW
        WHEN ( new.id IS NULL )
    BEGIN
        :new.id := myrole_seq.nextval;
    END;
    /
    
    CREATE SEQUENCE person_seq START WITH 1 NOCACHE;
    
    CREATE OR REPLACE TRIGGER person_tr BEFORE
        INSERT ON person
        FOR EACH ROW
        WHEN ( new.id IS NULL )
    BEGIN
        :new.id := person_seq.nextval;
    END;
    /
    
    CREATE SEQUENCE person_role_seq START WITH 1 NOCACHE;
    
    CREATE OR REPLACE TRIGGER person_role_tr BEFORE
        INSERT ON person_role
        FOR EACH ROW
        WHEN ( new.id IS NULL )
    BEGIN
        :new.id := person_role_seq.nextval;
    END;
    /
    
    谢谢

    Richa这就是你要找的吗?
    在你的情况下,你说: 若此人的角色为“AAA”或“BBB”,而不是“Auth”,则MYAccess列应将该人员的值显示为“Add”。所有其他值均应为空。 " Scott具有Auth,因此此条件产生false。根据这条规则,Scott不应该有“Add”。在您的预期输出中,它有“Add”。我错过什么了吗

    WITH person_roles (id, person_id, role_id) AS
    (
    SELECT  1, 1,1 FROM DUAL UNION ALL
    SELECT  2, 2,2 FROM DUAL UNION ALL
    SELECT  3, 2,3 FROM DUAL UNION ALL
    SELECT  4, 2,4 FROM DUAL UNION ALL
    SELECT  5, 3,1 FROM DUAL UNION ALL
    SELECT  6, 3,5 FROM DUAL UNION ALL
    SELECT  7, 4,3 FROM DUAL UNION ALL
    SELECT  8, 5,6 FROM DUAL UNION ALL
    SELECT  9, 6,3 FROM DUAL UNION ALL
    SELECT 10, 6,6 FROM DUAL UNION ALL
    SELECT 11, 6,2 FROM DUAL UNION ALL
    SELECT 12, 7,5 FROM DUAL UNION ALL
    SELECT 13, 7,6 FROM DUAL
    ),persons (id, person) AS
    (
    SELECT   1,'John' FROM DUAL UNION ALL   
    SELECT   2,'Scott' FROM DUAL UNION ALL  
    SELECT   3,'Ruth' FROM DUAL UNION ALL   
    SELECT   4,'Smith' FROM DUAL UNION ALL  
    SELECT   5,'Frank' FROM DUAL UNION ALL  
    SELECT   6,'Martin' FROM DUAL UNION ALL 
    SELECT   7,'Blake' FROM DUAL
    ),roles (id, role) AS
    (
    SELECT 1,'JJJ' FROM DUAL UNION ALL   
    SELECT 2,'Auth' FROM DUAL UNION ALL  
    SELECT 3,'AAA' FROM DUAL UNION ALL   
    SELECT 4,'MMM' FROM DUAL UNION ALL   
    SELECT 5,'KKK' FROM DUAL UNION ALL   
    SELECT 6,'BBB' FROM DUAL 
    ), rule_1(person_id, role_type)  AS
    (
    SELECT p.id, MIN(CASE WHEN r.ROLE = 'Auth' THEN 0 WHEN r.ROLE in ('AAA','BBB') THEN 1 ELSE 2 END) 
      FROM person_roles pr 
      JOIN persons p ON p.id = pr.person_id 
      JOIN roles r ON r.id = pr.role_id
      GROUP BY p.id
    )
    SELECT p.person, r.role, 
      CASE 
        WHEN rl.role_type = 1 AND r.role IN ('AAA','BBB') THEN 'Add'  
        WHEN rl.role_type = 0 AND r.role = 'Auth' THEN 'Remove' 
      END as action
      FROM person_roles pr 
      JOIN persons p ON p.id = pr.person_id 
      JOIN roles r ON r.id = pr.role_id
      JOIN rule_1 rl ON rl.person_id = pr.person_id
    ORDER BY p.person
    
    PERSON ROLE ACTION
    ------ ---- ------
    Blake  BBB  Add   
    Blake  KKK        
    Frank  BBB  Add   
    John   JJJ        
    Martin AAA        
    Martin Auth Remove
    Martin BBB        
    Ruth   KKK        
    Ruth   JJJ        
    Scott  MMM        
    Scott  AAA        
    Scott  Auth Remove
    Smith  AAA  Add   
    
    如果要避免CTE(with子句),可以将最后2条语句替换为1:

    SELECT p.person, r.role, 
      CASE 
        WHEN rl.role_type = 1 AND r.role IN ('AAA','BBB') THEN 'Add'  
        WHEN rl.role_type = 0 AND r.role = 'Auth' THEN 'Remove' 
      END as action
      FROM person_roles pr 
      JOIN persons p ON p.id = pr.person_id 
      JOIN roles r ON r.id = pr.role_id
      JOIN (
        SELECT p.id, MIN(CASE WHEN r.ROLE = 'Auth' THEN 0 WHEN r.ROLE in ('AAA','BBB') THEN 1 ELSE 2 END) as role_type
        FROM person_roles pr 
        JOIN persons p ON p.id = pr.person_id 
        JOIN roles r ON r.id = pr.role_id
        GROUP BY p.id
        ) rl ON rl.id = pr.person_id
    ORDER BY p.person
    

    看起来像是数据问题,或者添加部分的or语句需要一些工作。我在你的桌子上看到斯科特和马丁两次。第一个与Remove列匹配,并且使用OR语句逻辑,看起来它将这两条记录的第二行作为ADD。尝试将您的case语句分为多个部分,并单独运行以测试以缩小范围。此外,如果您可以发布可重复的代码,以便我们可以复制/粘贴它以运行它,则将帮助您更快、更轻松地获得帮助“join”不是一种表类型。您所称的“连接”表称为“详细信息”表。我将编辑你的帖子以进行更改,我想让你知道我在做什么以及为什么。另外,你确定你的详细信息表是正确的吗?在查询中,它似乎只有id(应该是这样),而没有名称和角色名称。您现在发布的“详细信息”表已经有了名称和角色名称,无需加入详细信息表。@mathguy感谢您的更改。明细表只有ID。我以所需的输出表为例展示了我的输出应该是什么样子,我编写的查询就是这样做的,只是计算不正确。Koen Lostrie您的理解是正确的。谢谢你的询问。我可以知道,如果只使用一个select语句而不是“WITH”子句,是否可以生成相同的输出?我问,因为我有其他列显示在我的实时查询。更新我的回答谢谢你科恩Lostrie。我接受了你的回答,投了赞成票。谢谢你的时间和帮助,我很乐意帮助你--KoenHow在另一个专栏上做Listag?我试图在这里添加表结构,但stackoverflow只有文本区域。所以在这里创建了另一个帖子