2015-09-01 102 views
3

我想执行一个SQL SELECT查询,它将遍历两个表。我知道我需要使用连接,但我不完全确定这是如何工作的(道歉 - 对于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'); 

但这返回6749340个结果时,应该只有150左右,所以我已经清楚了问题的地方 - 但想不通的地方。

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

在此先感谢!

+0

表格任务和事件之间的关系是什么? –

回答

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。你需要知道的是,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个。

编辑: 另一个注意一个连接。有不同类型的JOINRIGHTLEFTINNEROUTER。最常见的是INNER JOIN这也可以通过简单地完成JOIN

+0

@TimBiegeleisen,我会冒险猜测,因为我花时间解释联结以及如何运作,以及他如何将它应用于他的问题可能是为什么。马特,我很高兴这个答案对你有帮助。因为没有人解释过,所以我对JOINS有困难。我希望这可以帮助你。 – logixologist

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' 

您不必在您的查询,这意味着它将使作为结果的catersian product(两个表中的行制)的join条件。包括join条件以使其工作。

+0

谢谢 - 下面已经工作一种享受: 'SELECT COUNT(A.RSO_ParentID)AS '呼叫等待状态' 从任务A INNER JOIN事件乙 ON A.RSO_ParentID = B.IncidentNumber WHERE A.OwnerTeam ='第二线支持'和(A.Status ='接受'或A.Status ='等待')和(B.Status ='等待');' – Matt

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列,这两个表链接(您可以将其更改为正确的列名)。目前您的查询正在执行两个表的笛卡尔积,因为两个表彼此没有关联。

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,而不是一堆平等条件。
  • 请勿将列别名放在单引号中。虽然这是允许的,但通常会导致混淆。