SQL选择查询 - 两个表

时间:2015-09-01 14:14:23

标签: sql

我想执行一个SQL SELECT查询,它将遍历两个表。我理解我需要使用连接,但我不完全确定这是如何工作的(道歉 - 对SQL来说很新)。

SELECT COUNT(RSO_ParentID) AS 'Calls in Queue'
FROM Task, Incident
WHERE Task.OwnerTeam = '2nd Line Support'
    AND (Task.Status='Accepted' OR Task.Status='Waiting')
    AND (Incident.Status='Waiting');

但是当这应该只有大约150时,这会返回6,749,340个结果,所以我在某个地方显然出了问题 - 但是无法弄清楚在哪里。

非常感谢任何帮助。如果有任何其他有用的信息,请告诉我,我很乐意为您提供更多详细信息。

提前致谢!

4 个答案:

答案 0 :(得分:4)

SELECT COUNT(RSO_ParentID) AS 'Calls in Queue' 
FROM Task JOIN Incident 
ON --task.somecolumn = incident.somecolumn
WHERE Task.OwnerTeam='2nd Line Support'
AND (Task.Status='Accepted' OR Task.Status='Waiting')
AND Incident.Status='Waiting'

您的查询中没有join条件,这意味着它会给出catersian product(两个表中的行的乘积)作为结果。包括join条件以使其有效。

答案 1 :(得分:2)

您在两个表之间缺少JOIN条件。简单规则:从不FROM子句中使用逗号。这是一个猜测:

SELECT COUNT(RSO_ParentID) AS CallsinQueue
FROM Task t JOIN
     Incident i
     ON t.TaskId = i.TaskId
WHERE t.OwnerTeam = '2nd Line Support' AND
      t.Status IN ('Accepted', 'Waiting') AND 
      i.Status = 'Waiting';

其他建议:

  • 使用表别名。它们使表格更易于编写和阅读。
  • 使用IN,而不是一堆平等条件。
  • 不要将列别名放在单引号中。虽然这是允许的,但通常会导致混淆。

答案 2 :(得分:1)

试试这个:

SELECT COUNT(RSO_ParentID) AS 'Calls in Queue' 
FROM Task INNER JOIN Incident ON Task.ID = Incident.ID
WHERE Task.OwnerTeam='2nd Line Support' 
AND (Task.Status='Accepted' OR Task.Status='Waiting') 
AND (Incident.Status='Waiting');

假设使用ID列链接了两个表。(您可以将其更改为正确的列名)。目前您的查询正在执行两个表的笛卡尔积,因为这两个表没有相互链接。

答案 3 :(得分:0)

有很多不同的方法可以解决SQL问题以及多种方法来过滤掉您想要查看的数据集并将其缩小。让我们看看你原来的SQL语句:

SELECT COUNT(RSO_ParentID) AS 'Calls in Queue'
FROM Task, Incident
WHERE Task.OwnerTeam = '2nd Line Support'
    AND (Task.Status='Accepted' OR Task.Status='Waiting')
    AND (Incident.Status='Waiting');

不建议从2个表中进行选择。请记住SQLRelational Database Management System。您需要知道的是,TasksIncidents之间是否存在关联。

如果您想要将两个表的子集组合在一起,您必须知道它们之间的关系。由于我不知道你的完整架构是一个说明性的例子。您必须应用您的确切方案。

例如说事件表中有一个TaskID,所以你知道这个任务是一个事件,你会做这样的事情:

SELECT COUNT(RSO_ParentID) AS 'Calls in Queue'
FROM Task t 
JOIN Incident i
ON t.TaskID = i.TaskID
WHERE Task.OwnerTeam = '2nd Line Support'
    AND (Task.Status='Accepted' OR Task.Status='Waiting')
    AND (Incident.Status='Waiting');

这将只为您提供事故任务。可能是您要找的150。

修改 另一个注意事项是JOINS。 JOIN有不同类型。 RIGHTLEFTINNEROUTER。最常见的是INNER JOIN,也可以通过JOIN

来完成