我有一個簡單的表「TABLE_1」如何優化SQL查詢來實現最小執行時間
Org Customer Code Ordered Deleted Confirmed
RU Cust_1 A 1000 800 200
RU Cust_2 B 300 0 300
US Cust_3 C 800 100 700
RU Cust_4 B 100 100 0
US Cust_5 C 400 200 200
RU Cust_6 B 500 300 200
現在我需要改變這個表中的行,其中「已刪除」 <> 0喜歡
Org Code Customers Ordered Confirmed
RU A Cust_1 1000 200
RU B Cust_4, Cust_6 600 200
US C Cust_3, Cust_5 1200 900
我使用下面的查詢和功能
SELECT T1.Org,
T1.Code,
dbo.FUNC(T1.Code, T1.Org) AS 'Customers',
'Ordered' = (SELECT SUM(Ordered) FROM TABLE_1 AS T2 WHERE T2.Customer = T1.Customer AND T2.Code = T1.Code AND T2.Deleted<>0),
'Confirmed' = (SELECT SUM(Confirmed) FROM TABLE_1 AS T3 WHERE T3.Customer = T1.Customer AND T3.Code = T1.Code AND T3.Deleted<>0)
FROM TABLE_1 AS T1
WHERE T1.Deleted <> 0
功能 'FUNC':
ALTER FUNCTION [dbo].[FUNC] (@c VARCHAR(MAX), @org VARCHAR(MAX))
RETURNS VARCHAR(MAX) AS BEGIN
DECLARE @p VARCHAR(MAX) ;
SET @p = '' ;
SELECT @p = @p + T1.Customer + ', '
FROM TABLE_1 AS T1
WHERE T1.Code = @c AND T1.Org = @org AND T1.Deleted <> 0
GROUP BY T1.Customer
RETURN SUBSTRING(@p, 1, LEN(@p) - 1)
END
我認爲這不是如何得到結果的最佳方式,特別是如果我有一張大桌子。 有更好的解決方案嗎?
編輯: 表DDL例如
CREATE TABLE [dbo].[TABLE_1](
[Org] [nchar](10) NULL,
[Customer] [nchar](100) NULL,
[Code] [nchar](10) NULL,
[Ordered] [decimal](18,1) NULL,
[Deleted] [decimal](18,1) NULL,
[Confirmed] [decimal](18,1) NULL)
ON [PRIMARY]
你真的想在連接字符串中TSQL,有沒有表現層? – Jodrell 2013-05-08 08:21:26
我不知道我明白你的意思。我應該在查詢中使用串聯而不是函數嗎? – mbigun 2013-05-08 08:45:53
對於相同的客戶,組織和代碼是否有可能擁有多行?如果是這樣,大多數提供的答案(到目前爲止)將不會正確工作,而不需要針對不同的客戶進行修復。 – 2013-05-08 09:01:42