2009-04-25 35 views
0

我有这两个表:这可以用更好的方式书写吗?

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

而这个存储过程:

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与排除= 1,这会是用连接完成还是用更好的方式编写?

非常感谢

注:原因加入了“NOT IN”查询是为了性能考虑,表x包含了很多纪录被使用,而在数据表Y select语句返回一对夫妇只记录

编辑:也请注意,y中的ID可能会或可能不会在X存在(否则一个简单的加入会做),我想在y中所有的ID,除了那些存在于X与排除= 1

回答

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 
) 
+0

谢谢你,我知道这是写得不好,这是为什么问这个问题,原谅我可怜的SQL技能... – 2009-04-26 01:17:27

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

+0

因为y中的ID可能会或可能不会在X存在 – 2009-04-26 00:33:48

相关问题