2015-09-01 114 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,而不是一堆平等條件。
  • 請勿將列別名放在單引號中。雖然這是允許的,但通常會導致混淆。