我想执行一个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个结果,所以我在某个地方显然出了问题 - 但是无法弄清楚在哪里。
非常感谢任何帮助。如果有任何其他有用的信息,请告诉我,我很乐意为您提供更多详细信息。
提前致谢!
答案 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个表中进行选择。请记住SQL
是Relational Database Management System
。您需要知道的是,Tasks
和Incidents
之间是否存在关联。
如果您想要将两个表的子集组合在一起,您必须知道它们之间的关系。由于我不知道你的完整架构是一个说明性的例子。您必须应用您的确切方案。
例如说事件表中有一个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
有不同类型。 RIGHT
,LEFT
,INNER
,OUTER
。最常见的是INNER JOIN
,也可以通过JOIN