2011-06-09 63 views
1

我在查询中使用了几个表,并且它们都有一列deleted,指示记录是否已被删除(0或1) 。我一直在做的是:当字段名称相同时检查表间的值

WHERE table1.deleted = 0 and table2.deleted = 0 and table3.deleted = 0) 

我想知道是否有一种方式来表示整个表的相同的字段名称的值,如:

WHERE *.deleted = 0 

以上没有工作,显然。这可以做到吗?

+0

你是如何构建查询的?硬编码或动态PHP或类似?另外,您正在查看的表名是否有模式?根据这些问题的答案,你可能会做你想做的事情 - 需要更多的信息。 – 2011-06-09 18:27:35

+0

这是一个硬编码的查询。表名没有模式。基本上,我需要在外部查询和任何子查询的几乎每个连接和每个where子句中编写'table.deleted = 0',所以我希望有一种方法可以使它更加隐含。 – Anthony 2011-06-09 18:48:22

+1

2年5个月后,请停止在标题中写标签。 – 2011-06-09 18:59:01

回答

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) 

免责声明
正如David理所当然地说,只是因为它可以被做不做它 一个好主意。
MySQL将无法在此查询中使用索引,因此此版本将比您的原始版本慢。

+2

(轻微)句法缩短,代价是丢失索引' – 2011-06-09 19:04:53

+0

@David,并不是说这是个好主意,但它可以完成。 – Johan 2011-06-09 20:10:12

0

根据我们的讨论,这里有一个潜在的解决方案。根据查询和子查询的数量,您将为每个引用的表编写需要tableX.deleted = 0的查询和子查询,可能需要最短时间在这些表上设置视图。像这样为每个表:

CREATE VIEW table1deleted AS SELECT * FROM table1 WHERE deleted = 0; 

然后在你的查询您table1deleted而不是table1选择,因为在table1deleted意见中的所有项目都已经通过deleted = 0过滤。

0

由于没有办法直接在SQL中执行此操作,因此请考虑将SQL表达式存储在外部文件中,并使用工具生成这些表达式,以便在宏中存储重复的表达式。或者你可以编写函数来生成你使用的任何语言的SQL。

像约翰建议的那样的技巧可能会降低性能,而你真正的目标是使SQL表达式更容易处理。所以解决方案是停止硬编码并以更复杂的方式处理它们。

相关问题