2017-03-01 92 views
-1

我在下面的SQL查詢。我對所有沒有被這個sql查詢選中的記錄感興趣。我在下面做了一個嘗試,但是我的SQL語法有錯誤。請有人建議嗎?如何選擇未被sql語句選中的記錄?

SELECT * 
FROM codec_status NOT IN 
    (SELECT * 
    FROM codec_status 
    WHERE version_er_r='0' 
    OR ntpStatus_er_r='0' 
    OR stAvailable_er_r='0' 
    OR RXRate_er_r='0' 
    OR TXRate_er_r='0' 
    OR DefaultCallRate_er_r='0' 
    OR RemoteView_er_r='0' 
    OR VoiceVlan_er_r='0' 
    OR Transport_er_r='0' 
    ) 
+2

「我有一個錯誤在我的SQL語法」,那麼爲什麼不分享錯誤消息,你爲什麼讓我們猜? – HoneyBadger

回答

0

假設表codec_status中的主ID只是id。那麼你應該這樣做:

SELECT * FROM codec_status where id NOT IN 
(SELECT id FROM codec_status WHERE version_er_r='0' OR ntpStatus_er_r='0' OR stAvailable_er_r='0' OR RXRate_er_r='0' OR TXRate_er_r='0' OR DefaultCallRate_er_r='0' OR RemoteView_er_r='0' OR VoiceVlan_er_r='0' OR Transport_er_r='0') 
+0

我從MYsqli得到:'#1241 - 操作數應該包含1列' – tim

+0

你確定你在我的子查詢中只選擇了ID嗎? (括號內的那個) – Whencesoever

+0

謝謝兄弟!就是這樣。查詢起作用,所有數字最終加起來。 – tim

1

你應該學習邏輯門,這將幫助你在這些條件更多。這裏只是用De Morgan's Theorem

SELECT * FROM codec_status NOT IN (SELECT * FROM codec_status WHERE version_er_r='0' OR ntpStatus_er_r='0' OR stAvailable_er_r='0' OR RXRate_er_r='0' OR TXRate_er_r='0' OR DefaultCallRate_er_r='0' OR RemoteView_er_r='0' OR VoiceVlan_er_r='0' OR Transport_er_r='0') 

與此

SELECT * FROM codec_status WHERE version_er_r<>'0' AND ntpStatus_er_r<>'0' AND stAvailable_er_r<>'0' AND RXRate_er_r<>'0' AND TXRate_er_r<>'0' AND DefaultCallRate_er_r<>'0' AND RemoteView_er_r<>'0' AND VoiceVlan_er_r<>'0' AND Transport_er_r<>'0' 
0

某些DBMS有減號來替換它:

select * from tablename where .... 
minus 
select * from tablename where .... 

遺憾的是MySQL不支持減號來。如果你的表有一個ID列,你可以寫這樣的事情:

select * from codec_status 
where 
    id NOT IN (select ID 
      from 
       codec_status 
      where ....) 

(使用NOT IN,特別是如果你的子查詢返回NULL值時,是carefoul,但如果ID是主鍵,你應該沒有問題)。

無論如何,你可以寫你的查詢:

select * from codec_status 
where NOT (
    version_er_r='0' 
    OR ntpStatus_er_r='0' 
    OR stAvailable_er_r='0' 
    OR RXRate_er_r='0' 
    OR TXRate_er_r='0' 
    OR DefaultCallRate_er_r='0' 
    OR RemoteView_er_r='0' 
    OR VoiceVlan_er_r='0' 
    OR Transport_er_r='0' 
) 

即使在這裏,你必須小心空值(如果所有字段爲空,你想在你的第一個查詢或在第二次返回的行一個?)

0

只需使用not

SELECT * 
    FROM codec_status 
    WHERE NOT 
    (version_er_r='0' 
    OR ntpStatus_er_r='0' 
    OR stAvailable_er_r='0' 
    OR RXRate_er_r='0' 
    OR TXRate_er_r='0' 
    OR DefaultCallRate_er_r='0' 
    OR RemoteView_er_r='0' 
    OR VoiceVlan_er_r='0' 
    OR Transport_er_r='0')