1

基本的に、いくつかのテーブルを作成して遊んでみました。2 つのメイン テーブルと、多対多の結合テーブルがあります。これがDDLです:(私はHSQLDBを使用しています)

CREATE TABLE PERSON
(
    PERSON_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    NAME VARCHAR(50), MAIN_PERSON_ID INTEGER
)

CREATE TABLE JOB
(
    JOB_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    NAME VARCHAR(50)
)
CREATE TABLE JOB_PERSON
(
    PERSON_ID INTEGER, 
    JOB_ID INTEGER
)
ALTER TABLE JOB_PERSON ADD 
    CONSTRAINT FK_PERSON_JOB FOREIGN KEY(PERSON_ID) 
    REFERENCES PERSON ON DELETE CASCADE ON UPDATE CASCADE 

ALTER TABLE JOB_PERSON ADD
    CONSTRAINT FK_JOB_PERSON FOREIGN KEY(JOB_ID) 
    REFERENCES JOB ON DELETE CASCADE ON UPDATE CASCADE

ALTER TABLE PERSON ADD
    CONSTRAINT FK_PERSON_PERSON FOREIGN KEY(MAIN_PERSON_ID) 
    REFERENCES PERSON ON DELETE CASCADE ON UPDATE CASCADE

insert into person values(null,'Arthur', null);
insert into person values(null,'James',0);
insert into job values(null, 'Programmer')
insert into job values(null, 'Manager')
insert into job_person values(0,0);
insert into job_person values(0,1);
insert into job_person values(1,1);

PERSON.PERSON_ID に基づいて、JOB からオーファンを削除する削除ステートメントを作成したいと考えています (特定のジョブの結合テーブルにエントリが 1 つしかない場合)。

疑似言語で:

delete from job where job_person.job_id=job.job_id 
AND count(job_person.job_id)=1 AND job_person.person_id=X

X は person_id です。私はさまざまな方法を試しました。問題を引き起こしているのは「COUNT」の部分だと思います。私はSQL初心者なので、どんな助けでも大歓迎です。

4

2 に答える 2

2

私はフォローしていません。

FK 制約のため、JOB行を含む行 (1 つでも) を削除することはできません。したがって、行に基づいて行JOB_PERSONを削除する方法はありません。JOBPERSON

JOB_PERSONJOBまたはを削除する前に、行を削除する必要PERSONがあります。

noを使用してすべてのJOB行を削除する場合JOB_PERSON、1 つの方法は次のとおりです。

DELETE FROM JOB
WHERE JOB_ID NOT IN (
    SELECT JOB_ID
    FROM JOB_PERSON
)

特定の人物のすべてのJOB_PERSON行を削除してから、すべての孤児を削除する場合は、次の 2 つの手順で行います。

DELETE FROM JOB_PERSON
WHERE PERSON_ID = X

DELETE FROM JOB
WHERE JOB_ID NOT IN (
    SELECT JOB_ID
    FROM JOB_PERSON
)

以前に X にリンクされていた孤立した のみを削除する場合はJOB、最初の削除の前にそれらを一時テーブルに保持する必要があります。

INSERT INTO TEMP_TABLE
SELECT JOB.JOB_ID
FROM JOB
INNER JOIN JOB_PERSON
    ON JOB_PERSON.JOB_ID = JOB.JOB_ID
WHERE JOB_PERSON.PERSON_ID = X

DELETE FROM PERSON
WHERE PERSON_ID = X

-- YOUR CASCADING DELETE DOES THIS:
/*
DELETE FROM JOB_PERSON
WHERE PERSON_ID = X
*/

-- Now clean up (only) new orphans on the other side
DELETE FROM JOB
WHERE JOB_ID NOT IN (
    SELECT JOB_ID
    FROM JOB_PERSON
)
AND JOB_ID IN (
    SELECT JOB_ID
    FROM TEMP_TABLE
)
于 2008-11-07T14:34:04.623 に答える
1

これにより、テーブル JOB_PERSON (Orpheans) にエントリがない JOB エントリがテーブルから削除されます。

DELETE FROM JOB
WHERE JOB_ID NOT IN (
    SELECT JOB_ID
    FROM JOB_PERSON
)

他のテーブルの外部によってリンクされている行を削除することはできません...

于 2008-11-07T14:36:23.387 に答える