我有这两个表:
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
答案 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)。