用查询填写桥表

时间:2018-12-16 01:55:35

标签: sql postgresql

我有四个表,这些表的主要目的是使消息具有多对多的关键字关系。如果类别ID匹配,则每个关键字可以有很多消息,并且每条消息可以有很多相关的关键字。

CREATE TABLE public.trigger_category
(
    id integer NOT NULL DEFAULT nextval('trigger_category_id_seq'::regclass),
    description text COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT trigger_category_id PRIMARY KEY (id)
)
CREATE TABLE public.trigger_keyword
(
    id integer NOT NULL DEFAULT nextval('trigger_keyword_id_seq'::regclass),
    keyword text COLLATE pg_catalog."default" NOT NULL,
    category_id bigint NOT NULL,
    CONSTRAINT trigger_keyword_id PRIMARY KEY (id),
    CONSTRAINT trigger_keyword_category_id_fkey FOREIGN KEY (category_id)
        REFERENCES public.trigger_category (id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE NO ACTION
)
CREATE TABLE public.trigger_message
(
    id integer NOT NULL DEFAULT nextval('trigger_message_id_seq'::regclass),
    message text COLLATE pg_catalog."default" NOT NULL,
    category_id bigint NOT NULL,
    CONSTRAINT trigger_message_id PRIMARY KEY (id),
    CONSTRAINT trigger_message_category_id_fkey FOREIGN KEY (category_id)
        REFERENCES public.trigger_category (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
CREATE TABLE public.trigger_keyword_trigger_message
(
    trigger_keyword_id bigint NOT NULL,
    trigger_message_id bigint NOT NULL,
    CONSTRAINT trigger_keyword_trigger_message_trigger_keyword_id_trigger_mess PRIMARY KEY (trigger_keyword_id, trigger_message_id),
    CONSTRAINT trigger_keyword_trigger_message_trigger_keyword_id_fkey FOREIGN KEY (trigger_keyword_id)
        REFERENCES public.trigger_keyword (id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE NO ACTION,
    CONSTRAINT trigger_keyword_trigger_message_trigger_message_id_fkey FOREIGN KEY (trigger_message_id)
        REFERENCES public.trigger_message (id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE NO ACTION
)

我将关键字手动插入trigger_keyword表中,并将消息手动插入trigger_message表中,如果它们相关,则它们将得到相同的category_id

是否可以编写一个查询,该查询将自动遍历所有行,并且如果关键字和消息具有相同的category_id,那么它将为桥接表trigger_keyword_trigger_message创建所有适当的行? / p>

1 个答案:

答案 0 :(得分:0)

您可以使用Oracle Merge Query来实现。

USING子句选择要插入的所有记录,而WHEN MATCHED确实要在桥表中插入。

MERGE INTO trigger_keyword_trigger_message tktm
USING (
    SELECT tk.id tk_id, tm.id tm_id
    FROM
        trigger_keyword tk
        INNER JOIN trigger_message tm on tm.category_id = tk.category_id

) us
WHEN MATCHED THEN
    INSERT (tktm.trigger_keyword_id, tktm.trigger_message_id)
    VALUES (us.tk_id, us.tm_id)
;