2012-11-08 21 views
1

我試圖做一些使用MSSQL,我認爲是可能的(很容易),但我不知道如何發出正確的搜索字符串。我有下面的情況。MSSQL選擇單行與所有引用計數

Table A 
UID | Value.... 
1 | a 
2 | b 
3 | c 


Table B 
PartTypes_uid_fk | Value.... 
1   | a 
1   | b 
1   | c 
1   | d 
1   | e 
3   | 67 
3   | 1354 

我試圖得到以下結果,所有結果查詢表A {表A *}和在同一行的結果顯示錶B引用的數量計數{} TableB.tableA_fk我 有哪些到目前爲止是以下。

SELECT DISTINCT t1.uid, CONVERT(varchar(MAX), t1.Name) AS Name, CONVERT(varchar(MAX), t1.Description) AS Description, Count(t2.Items_uid_fk) OVER (Partition By t2.PartTypes_uid_fk) as Count FROM [Table1] as t1 left outer join Table2 as t2 on t2.PartTypes_uid_fk=t1.uid;

這適用於所有的表A記錄與表B中的相關記錄,但如果有表B 0項將無法正常工作。 varchars的轉換是必需的,因爲它們是ntext格式,並且它是不同的。

感謝您提前給予您所有的幫助。 斯蒂芬

回答

1

相反的運行與GROUP BY on N/TEXT列問題,運行速度更快,你想預將B表和LEFT JOIN合併在一起。

select t1.*, ISNULL(t2.c, 0) AS CountOfB 
from table1 t1 
left join 
(
    select parttypes_uid_fk, count(*) c 
    from table2 
    group by parttypes_uid_fk 
) t2 on t2.PartTypes_uid_fk=t1.uid 
+0

+1。我沒有讀過這個名詞。這將是你最有效的手段。 SQL在優化這個時很聰明,而且在將子查詢與主查詢匹配時不會執行表掃描。所以我認爲這是應該被接受的解決方案。 –

+0

這很好,謝謝。 – spraus

0

這是比這更容易:

SELECT t1.uid, t1.Name, COUNT(*) 
FROM [Table1] t1 
LEFT JOIN [Table2] t2 ON t2.PartTypes_uid_fk = t1.uid 
GROUP BY t1.uid, t1.Name 
+0

錯過的描述b將它添加到選擇列表並按列表分組,並且它是相同的。 –

+0

對編輯抱歉,但這有同樣的問題。任何0的計數不會作爲一行返回。 PS謝謝你的幫助 – spraus

+0

@spraus我爲RichardTheKiwi的解決方案添加了我的投票權。 http://stackoverflow.com/a/13296467/1795053我認爲這是迄今爲止提供的最佳解決方案。 –

0

您的查詢應該是

SELECT t1.uid, 
CONVERT(varchar(MAX), t1.Name) AS Name, 
CONVERT(varchar(MAX), t1.Description) AS Description, 
Count(t2.Items_uid_fk) CountItems 
FROM [Table1] as t1 left outer join Table2 as t2 on t1.uid = t2.PartTypes_uid_fk 
GROUP BY uid, t1.name, t1.Description; 
+0

感謝您的幫助,如果不是顯示0計數結果的問題,那麼這將起作用。 – spraus