我在以下SQL语句中理解SELECT * FROM myTable WHERE 0 = ...
有困难。
SELECT * FROM myTable WHERE 0 = (SELECT COUNT(*) FROM incTable
WHERE myTable.export_date <= incTable.export_date
AND myTable.colA = incTable.colA
AND myTable.colB = incTable.colB
AND myTable.colC = incTable.colC)
根据我的理解,通常在WHERE
子句中,将针对某个其他实体(即另一个列或值)评估列。对两个数字进行评估意味着什么(即WHERE 0 = 5
)?无论上述SQL语句中SELECT * FROM myTable
子句的结果如何,myTable
总是会返回WHERE
的内容吗?
答案 0 :(得分:4)
0 = 5将为false,因此不会返回任何内容。如果子查询没有返回任何行,您将获得myTable中的所有行。
这是做EXISTS()的一种奇怪方式。
答案 1 :(得分:2)
你的想法太难了。括号中的整个select语句可以移动到等号的另一侧,它仍然可以工作......
它可以很容易地写成
SELECT * FROM myTable
WHERE (
SELECT COUNT(*) FROM incTable WHERE myTable.export_date <= incTable.export_date
AND myTable.colA = incTable.colA AND myTable.colB = incTable.colB AND myTable.colC =
incTable.colC) = 0
为了简化,假设整个SELECT Count(*)...语句被伪sql中名为“@subquery”的变量替换,它看起来像
选择*来自myTable,其中0 = @subquery
或
选择* from myTable,其中@subquery = 0
就像代数一样。您可以翻转“=”运算符一侧的项目而不更改语句的含义。 (如果a = b则b = a) - The Symmetric Propertyof Equality
实际上它正在myTable
中搜索记录而不匹配incTable
中的记录。
答案 2 :(得分:2)
如果count子查询返回0,我相信where子句将计算为true。
答案 3 :(得分:2)
它只是从myTable中选择了incTable中没有任何相应行(由子查询中where子句中的内容确定)的行,因此where 0 = select count(*) ...
。也许如果你扭转它,你对where select count(*) ... = 0
更有意义(但基本上顺序并不重要)。
答案 4 :(得分:0)
第二个select语句聚合并计算其结果。 如你所愿,它将返回一个数字。