我在查询中使用了几个表,并且所有表都有一个列deleted
,用于指示记录是否已删除(0或1)。我一直在做的是:
WHERE table1.deleted = 0 and table2.deleted = 0 and table3.deleted = 0)
我想知道是否有办法在表格中指明相同字段名称的值,例如:
WHERE *.deleted = 0
显然,上述方法无效。可以这样做吗?
答案 0 :(得分:1)
无法完成。您需要在第一个示例中明确引用每一列。
答案 1 :(得分:1)
使用按位或和
WHERE (table1.deleted & table2.deleted & table3.deleted) = 0
请参阅:http://dev.mysql.com/doc/refman/5.5/en/bit-functions.html
甚至更短:
WHERE NOT(table1.deleted & table2.deleted & table3.deleted)
<强>声明强>
正如大卫正确地指出的那样,仅仅因为它可以做到并不是一个好主意
MySQL将无法在此查询中使用索引,因此该版本将比原始版本慢。
答案 2 :(得分:0)
根据我们的讨论,这是一个潜在的解决方案。根据每个引用表中需要tableX.deleted = 0
的查询和子查询的数量,在这些表上设置视图的最短时间可能是值得的。每张桌子都有这样的东西:
CREATE VIEW table1deleted AS SELECT * FROM table1 WHERE deleted = 0;
然后在您的查询中,您选择table1deleted
而不是table1
,因为table1deleted
视图中的所有项目都已经过deleted = 0
过滤。
答案 3 :(得分:0)
由于没有办法在SQL中直接执行此操作,因此请考虑将SQL表达式存储在外部文件中,并使用工具生成它们,以便在宏中存储重复的表达式。或者你可以用你编写的任何语言编写函数来生成SQL。
Johan建议的技巧可能会降低性能,这里的真正目标是使SQL表达式更易于处理。所以解决方案是停止对其进行硬编码并以更复杂的方式处理它们。