Заполните таблицу мостов с запросом - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть четыре таблицы, основная цель этих таблиц состоит в том, чтобы иметь отношение многие ко многим ключевым словам к сообщениям.у каждого ключевого слова может быть много сообщений, и каждое сообщение может иметь много ключевых слов, с которыми они связаны вместе, если совпадает идентификатор категории.

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?

1 Ответ

0 голосов
/ 16 декабря 2018

Этого можно добиться с помощью 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)
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...