2009-11-16 92 views
1

我有一個頁面,我正在運行一個初始SQL查詢來獲取主題列表,然後我遍歷這個查詢併爲從原始主題查詢返回的每條記錄運行兩個附加查詢(我碰巧在ColdFusion中這樣做,但不確定真的很重要)。這兩個附加查詢爲該特定主題執行COUNT,然後輸出結果(輸出主題名稱,然後輸出該主題的兩個計數)。我試圖提高此頁面的性能,並想知道我是否可以以某種方式將它合併到單個查詢中。合併一個COUNT查詢

初始查詢:

 
    SELECT COUNT(test_ID) as priority_count 
    FROM Test_Queue 
    WHERE priority_flag = 1 AND subject_ID = #SubjectQuery.subject_ID# 

    SELECT COUNT(test_ID) as locked_count 
    FROM Test_Queue 
    WHERE locked = 1 AND subject_ID = #SubjectQuery.subject_ID# 

建議如何將這些可能會進行優化:

初始查詢的環路內
 
    SELECT subject_ID, subject_name 
    FROM Subjects 
    ORDER BY subject_name 

查詢? DB是MS SQL 2008.謝謝。

+0

你如何過濾基於subject_ID的Test_Queue,這裏沒有顯示。 – Deeksy 2009-11-16 23:45:44

+0

在循環中的查詢中,WHERE子句是否包含subject_ID? – t3rse 2009-11-16 23:47:18

+0

對不起,我刪除了一些無關信息,並且意外地將其取出。我編輯了上面的查詢。 – 2009-11-16 23:51:11

回答

3
SELECT 
    subject_ID, 
    subject_name, 
    priority_count = (select count(test_id) from test_queue where priority_flag = 1), 
    locked_count = (select count(test_id) from test_queue where locked = 1) 
FROM Subjects 
ORDER BY subject_name 

,或者,如果計數都應該納入subject_id(只是猜測),然後

SELECT 
    s.subject_ID, 
    s.subject_name, 
    priority_count = (select count(test_id) from test_queue t where priority_flag = 1 and t.subject_id = s.subject_id), 
    locked_count = (select count(test_id) from test_queue t where locked = 1 and t.subject_id = s.subject_id) 
FROM Subjects s 
ORDER BY subject_name 
+0

+1這是我在select中使用子查詢的路線。我不得不說,我使用格式()AS output_var。只是我的偏好,不應該有任何區別。 – Eddie 2009-11-17 02:59:45

2

這應該這樣做,假設從主體聯接列test_queue是正確的,你的避風港'不指定test_queue中的哪一列引用科目

select 
    subjects.subject_id 
    ,subjects.subject_name 
    ,sum(case when test_queue.priority_flag=1 THEN 1 ELSE 0 END) as priority_count 
    ,sum(case when test_queue.locked=1 THEN 1 ELSE 0 END) as locked_count 
    from 
    subjects 
    left join test_queue 
     on subjects.subject_id=test_queue.subject_id 
    group by subjects.subject_id, subjects.subject_name 
    order by subjects.subject_name 
+0

我喜歡你的使用組與VS不同...順便說一句爲什麼大家都寫不同風格/格式的SQL代碼?只是好奇 :) – crosenblum 2009-12-22 02:05:58

1

這樣的事情? (您可能需要轉換爲INT如果priority_flag或鎖定是一類是SUM不喜歡)

SELECT 
    subject_ID 
, subject_name 
, SUM(priority_flag) AS priority_count 
, SUM(locked) AS locked_count 
FROM Subjects s, Test_Queue tq 
GROUP BY subject_ID, subject_name 
ORDER BY subject_name 
; 
1

我帶你去一個平底船是Test_Queue.Subject_ID = Subjects.Subject_ID

SELECT s.subject_ID, s.subject_name, COUNT(t1.*) as priority_count, COUNT(t2.*) as locked_count 
    FROM Subjects s 
    LEFT OUTER JOIN Test_Queue t1 
    ON s.Subject_ID = t1.Subject_ID 
    AND t1.priority_flag = 1 
    LEFT OUTER JOIN Test_Queue t2 
    ON s.Subject_ID = t2.Subject_ID 
    AND t2.locked = 1 
GROUP by s.subject_ID, s.subject_name 
ORDER BY s.subject_name