我最近遇到过这个问题。我试图删除列名上带有特定字符的行。我这样做是通过创建几个临时表,如下所示:
CREATE TEMPORARY TABLE tri1 as
SELECT * FROM loading WHERE postcode != 'n/a';
CREATE TEMPORARY TABLE tri2 as
SELECT * FROM tri1 WHERE postcode != '--';
CREATE TEMPORARY TABLE tri3 as
SELECT * FROM tri2 WHERE postcode != 'n-a';
CREATE TEMPORARY TABLE tri4 as
SELECT * FROM tri3 WHERE postcode != '99999';
这个冗长的解决方案效果很好。
然而,我的第一次尝试是使用此SQL查询:
CREATE TEMPORARY TABLE tri1 AS
SELECT * FROM loading WHERE (postcode != 'n/a' OR postcode != '--' OR postcode != 'n-a' OR postcode != '99999');
问题是我返回的行数少于我上面执行顺序级联临时表排序时的行数。
为什么?
感谢。
答案 0 :(得分:2)
使用这么多临时表不是解决问题的方法。你只使用一个查询是正确的,但你的逻辑错了。以下是更正的查询:
CREATE TEMPORARY TABLE tri1 AS
SELECT * FROM loading
WHERE (postcode != 'n/a' AND postcode != '--' AND postcode != 'n-a' AND postcode != '99999');
问题是我获得的返回行数少于我执行顺序级联临时表时的行数
你让记录从裂缝中滑落。根据您的逻辑,记录必须具有所有条件才能被拒绝。例如,没有' - '的记录会通过,即使它有'99999'。
管理我上面提到的查询的逻辑规则称为 De Morgan定律,您可以read about it here。