Можно ли это написать лучше? - PullRequest
0 голосов
/ 26 апреля 2009

У меня есть две таблицы:

CREATE TABLE x
(
    id INT NOT NULL,
    exclude BIT NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE y
(
    id INT NOT NULL,
    field1 INT NOT NULL,
    field2 INT NOT NULL,
    field3 INT NOT NULL,
    field4 INT NOT NULL,
    field5 INT NOT NULL,
    PRIMARY KEY (id)
);

И это sproc:

CREATE PROCEDURE proc1
(
    i1 INT,
    i2 INT,
    i3 INT,
    i4 INT,
    i5 INT
)
BEGIN

SELECT
    id
FROM
    y
WHERE
    field1 = i1,
    field2 = i2,
    field3 = i3,
    field4 = i4,
    field5 = i5
    AND id NOT IN (
        SELECT
            y.id
        FROM
            y, x
        WHERE
            y.field1 = i1
            AND y.field2 = i2,
            AND y.field3 = i3,
            AND y.field4 = i4,
            AND y.field5 = i5
            AND x.id = y.id
            AND x.exclude = 1);

END IF;

Я в основном хочу получить поле id от y, кроме тех, которые существуют в x с exclude = 1, это можно сделать с помощью объединений или написать лучше?

Большое спасибо

Примечание: причина, по которой соединение используется в подзапросе NOT IN, для повышения производительности, таблица x содержит много записей, в то время как оператор select в таблице y возвращает только пару записей

Редактировать: Также обратите внимание, что идентификатор в y может существовать или не существовать в x (в противном случае подойдет простое объединение), я хочу получить все идентификаторы в y, кроме тех, которые существуют в x с exclude = 1

Ответы [ 2 ]

1 голос
/ 26 апреля 2009

Я не уверен, что следую вашей логике для использования соединения внутри вашего подзапроса. Вы делаете ту же самую работу дважды.

Вы можете попробовать:

SELECT id
FROM y
WHERE field1 = 2
AND field2 = 3
AND field3 = 4
AND field4 = 5
AND field5 = 6
AND NOT EXISTS(
SELECT x.id
FROM x
WHERE x.id = y.id
AND x.exclude = 1
)
0 голосов
/ 26 апреля 2009

Я бы спросил, почему этот запрос не возвращает правильные результаты.

    SELECT
        y.id
    FROM
        y, x
    WHERE
        y.field1 = i1
        AND y.field2 = i2,
        AND y.field3 = i3,
        AND y.field4 = i4,
        AND y.field5 = i5
        AND x.id = y.id
        AND x.exclude = 0;

Если у вас проблемы с производительностью, вы можете посмотреть, как добавить индекс (внешний ключ таблицы y в x.id).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...