2017-03-01 34 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')