2009-04-25 67 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

相關問題