计算其他表中不存在的所有记录 - SQL查询

时间:2015-09-21 05:24:14

标签: mysql

我有两(2)个表,我正在尝试计算Table1中的所有记录,Table1_delta是来自Table1_delta的pagename尚未列入Table1。 Table1_delta中的Incase页面名称列在Table1中,status必须为1,以便它包含在计数结果中。

示例表结构:

表1

+-----------+--------+
| pagename  | status |
+-----------+--------+
| pagename1 |   2    |
| pagename2 |   1    |
+-----------+--------+

Table1_delta

+-----------+
| pagename  |
+-----------+
| pagename1 |
| pagename2 |
| pagename3 |
| pagename4 |
+-----------+

表格样本应返回“3”

pagename3和pagename4未在Table1中列出(返回2),而Table1中的pagename2的status = 1(返回1)。总共有来自Table1_delta的 3个页面名称未在表1中列出,并且从Table1记录,其中status = 1.我想知道如何查询这个?我正在使用MySQL v5.6.17。谢谢!

3 个答案:

答案 0 :(得分:1)

以下是使用连接的替代解决方案:

SELECT COUNT(*)
FROM Table1_delta t1 LEFT JOIN Table1 t2
ON t1.pagename = t2.pagename
WHERE t2.status IS NULL OR t2.status = 1

以下是上述查询中的临时表:

+-----------+--------+
| pagename  | status |
+-----------+--------+
| pagename1 |  2     |    # this row is NOT counted
| pagename2 |  1     |    # +1 this row has status = 1 and is counted
| pagename3 |  null  |    # +1 this row has status = null and is counted
| pagename4 |  null  |    # +1 this row is also null and is counted
+-----------+--------+

请查看以下链接,了解正在运行的演示。

<强> SQLFiddle

答案 1 :(得分:0)

如果我理解正确:

SELECT COUNT(*) FROM Table1_Delta
WHERE pagename NOT IN 
  (SELECT pagename FROM Table1 WHERE status = 1)

更新

根据评论中的要求,此查询的作用如下:

首先,子查询:SELECT pagename FROM Table1 WHERE status = 1从状态为1的pagename条记录中检索Table1字段。

因此,在示例中,它会返回包含pagename2的单行。

然后主查询计算Table1_Delta SELECT COUNT(*) FROM Table1_Delta 包含(Pagename)这些值的WHERE Pagename NOT IN (<subquery>)pagename1)中的所有记录来自子查询。

所以这会匹配3个条目(pagename3pagename4float ff = 99.95f; double dd = (double)(decimal)ff; ),这就是你获得的数量

历史上,使用子查询被认为比使用连接慢,但坦率地说,RDBMS已经在很长时间内优化了查询,对于像这样的简单情况,它可能是&#34;可能&#34; (我还没有测量过)更快。它实际上取决于真实的情况和数据库......但SQL代码比加入IMO更加不言自明。您的里程可能会有所不同。

答案 2 :(得分:0)

尝试使用连接

Select count(Table1_delta.pagename) from Table1_delta 
INNER JOIN Table1 ON 
    Table1_delta.pagename != Table1 .pagename 
    AND Table1.status != 1