这可以用更好的方式编写吗?

时间:2009-04-25 23:57:23

标签: sql mysql

我有这两个表:

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;

我基本上想从y获取id字段,除了那些存在于x中且带有exclude = 1的字段,可以通过连接完成还是以更好的方式编写?

非常感谢

注意:在'NOT IN'子查询中使用连接的原因是出于性能考虑,表x包含大量记录,而表y上的select语句只返回几个记录

编辑:另请注意,y中的id可能存在也可能不存在于x中(否则一个简单的连接就会存在),我想要y中的所有id,除了x中存在的除外= 1

2 个答案:

答案 0 :(得分:1)

我不确定我是否按照您的逻辑在子查询中使用连接。你做了两次相同的工作。

你可以尝试:

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
)

答案 1 :(得分:0)

我会问为什么这个查询没有返回正确的结果。

    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)。