SQL选择查询 - 两个表

3
我想执行一个 SQL SELECT 查询,它将跨越两个表。我知道我需要使用 JOIN,但我不完全确定这将如何工作(抱歉 - 对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');

但是这个搜索返回了6,749,340个结果,而实际上只应该有大约150个,所以我显然在某个地方出错了 - 但是无法确定出错的地方。
如果有任何有用的额外信息,请告诉我,我将很乐意为您提供进一步的细节。
提前致谢!

表格任务和事件之间有什么关系? - Raj Kamuni
4个回答

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条件,这意味着它将产生一个笛卡尔积(两个表中行的乘积)作为结果。请添加join条件以使其正常工作。


谢谢 - 以下代码已经完美运行:SELECT COUNT(A.RSO_ParentID) AS '等待状态的呼叫数量' FROM Task A INNER JOIN Incident B ON A.RSO_ParentID = B.IncidentNumber WHERE A.OwnerTeam='2nd Line Support' AND (A.Status='Accepted' OR A.Status='Waiting') AND (B.Status='Waiting'); - Matt

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

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

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');

选择从两个表中查询不是推荐的做法。请记住,SQL是一个关系型数据库管理系统。你需要知道的是,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来完成。


@TimBiegeleisen, 我猜应该是因为我花时间解释了连接和它的工作原理,以及他如何将其应用到他的问题上,所以这可能是原因。Matt,很高兴这个答案对你有帮助。我在理解连接方面遇到了困难,因为没有人曾经解释过它。希望这对你有所帮助。 - logixologist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接