2011-03-02 93 views
2

這工作我所期望的方式不是(c是一個光標)蟒蛇+ sqlite3的:使用連接查詢

c.execute('''SELECT e1.file, e1.sourceUrl, e1.rev 
     FROM externals1 AS e1 
     LEFT JOIN externals as e0 
     ON (e1.file = e0.file) 
     AND (e1.rev <> e0.rev) 
    ''') 

,但我在這裏得到一個錯誤:

c.execute('''SELECT e1.file, e1.sourceUrl, e1.rev 
     FROM externals1 AS e1 
     LEFT JOIN externals as e0 
     ON (e1.file = e0.file) 
     AND (e1.rev IS NOT e0.rev) 
    ''') 

與消息

sqlite3.OperationalError: near "e0": syntax error 

發生了什麼事?我想處理e0.rev爲NULL的情況。

回答

2
SELECT e1.file, e1.sourceUrl, e1.rev 
    FROM externals1 AS e1 
    LEFT JOIN externals as e0 
    ON (e1.file = e0.file) 
    AND (e1.rev IS NOT NULL) 

NULL的意思是「未分配或未知值」,因此不能等於或不等於別的東西。 (未知或未分配的東西如何與未知或未分配的東西進行比較?)因此,您不能使用<>=來測試它們;你必須使用特殊的運算符IS/IS NOT。

您還可以使用

NOT (e1.rev = e0.rev) 

,如果你想測試不相等。

+0

注意(至於爲什麼這個語法是有效的):結構是'operand IS NULL'和'operand不是NULL「。但是,這與查詢#1不一樣? – 2011-03-02 19:44:38

+0

@pst:我不確定你在問什麼。 'IS NULL/IS NOT NULL'與OP的第一個查詢中的'<>'不一樣。我將添加一個關於NULL的操作數的解釋。 – 2011-03-02 19:54:47

+0

@Ken White我對這個問題感到困惑 - 我不確定操作員在尋找什麼,但是這個答案已被接受,所以一定是需要的:P – 2011-03-02 20:21:49

2

!=是ANSI不等於,你在第二個例子中發佈的是我知道的任何數據庫的無效SQL。你可以嘗試:

SELECT e1.file, e1.sourceUrl, e1.rev 
    FROM externals1 AS e1 
LEFT JOIN externals as e0 ON e0.file = e1.file 
         AND e1.rev NOT IN (e0.rev) 
0
SELECT e1.file, e1.sourceUrl, e1.rev 
FROM externals1 AS e1 
LEFT JOIN externals as e0 
    ON e0.file = e1.file 
    AND e1.rev <> e0.rev 
    AND e1.rev IS NOT NULL 

的結構是operand IS NULLoperand IS NOT NULL(只有一個操作數要麼在IS NUll/IS NOT NULL運營商!) - 我想象之外的NULL檢查到「不」需要,但這個問題很難說清楚。

請記住,當(或兩者)xy都是NULL時,x <> y始終爲真。 (至少對於符合SQL89的引擎。)

快樂SQL'ing。

此外:Wikipedia article on NULL是一個有趣的閱讀,一般來說。它討論了一些基本的NULL結構(可能或可能不完全適用於特定的數據庫......)