2011-09-26 69 views
-2

我寫我上傳的查詢到我的託管服務器,並不知何故,他們說,臨時表的創建是他們的服務器上禁用該作品在我的本地SQL Server 2005上偉大的查詢SQL查詢。沒有臨時表

我的查詢看起來像這樣

create table #tmp 
(
    srno int identity (1,1) , 
    orderid int, 
    orderdate datetime, 
    product_code varchar(255), 
    product_name varchar(255), 
    shipping_cost decimal(18,2) 
) 

insert into #tmp (orderid, orderdate, product_code, product_name, shipping_cost) 
    (select distinct 
     ord.orderid, ord.orderdate, odn.productcode, 
     odn.productname, ord.totalshippingcost 
    from OrderNew ord 
    inner join order_detailsnew odn on ord.orderid = odn.orderid) 

declare @rowcount int, @flag int, @orderid int 

set @rowcount = (select @@ROWCOUNT) 

set @flag = 0 

while (@flag <@rowcount) 
begin 
    set @orderid = (select orderid from #tmp where srno = @flag + 1) 

    if exists (select 1 from #tmp where orderid = @orderid) 
    begin 
     update #tmp 
     set shipping_cost = 0.0 
     where srno IN (select srno from #tmp 
        where orderid = @orderid 
        AND srno NOT IN (SELECT TOP 1 srno FROM #tmp where orderid = @orderid)) 

    end 
    set @flag = @flag+1 
end 

select * from #tmp 
drop table #tmp 

所以不知道這是否查詢可以不用臨時表被寫入,加入等不知道這是否行得通呢?有任何建議嗎?

+1

什麼是你想怎麼辦。你能解釋你的數據庫設置和目標嗎? – Dave

回答

1

我相信這個查詢喂到報告這就是爲什麼你只需要一次總運輸成本,而你並不需要一個臨時表此爲參考,如果你需要,你總是可以做這個:

DECLARE @tmp TABLE 
(
    srno int identity (1,1) , 
    orderid int, 
    orderdate datetime, 
    product_code varchar(255), 
    product_name varchar(255), 
    shipping_cost decimal(18,2) 
) 

,並使用@tmp而非#tmp

但你不應該需要爲這個臨時表,見下圖:

SELECT ord.orderid, ord.orderdate, odn.productcode, odn.productname, ord.totalshippingcost 
FROM OrderNew AS ord 
    INNER JOIN order_detailsnew AS odn ON odn.orderid = ord.orderid 
WHERE odn.productcode = (SELECT MIN(productcode) FROM OrderNew AS odn2 WHERE odn2.orderid = ord.orderid) 
UNION ALL 
SELECT ord.orderid, ord.orderdate, odn.productcode, odn.productname, 0.0 AS totalshippingcost 
FROM OrderNew AS ord 
    INNER JOIN order_detailsnew AS odn ON odn.orderid = ord.orderid 
WHERE odn.productcode > (SELECT MIN(productcode) FROM OrderNew AS odn2 WHERE odn2.orderid = ord.orderid) 
ORDER BY ord.orderid, ord.orderdate, odn.productcode 

工作正常,我與FOLL由於測試腳本:

DECLARE @ord TABLE 
(
    orderid int, 
    orderdate datetime, 
    totalshippingcost decimal(18,2) 
) 
DECLARE @odn TABLE 
(
    orderid int, 
    productcode varchar(255), 
    productname varchar(255) 
) 

INSERT INTO @ord VALUES(1, CAST('20110101' AS DATETIME), 50.25) 
INSERT INTO @ord VALUES(2, CAST('20110105' AS DATETIME), 78.15) 
INSERT INTO @ord VALUES(3, CAST('20110112' AS DATETIME), 65.50) 
INSERT INTO @ord VALUES(4, CAST('20110112' AS DATETIME), 128.00) 

INSERT INTO @odn VALUES(1, 'aa', 'AAA') 
INSERT INTO @odn VALUES(1, 'bb', 'BBB') 
INSERT INTO @odn VALUES(1, 'cc', 'CCC') 
INSERT INTO @odn VALUES(2, 'aa', 'AAA') 
INSERT INTO @odn VALUES(2, 'bb', 'BBB') 
INSERT INTO @odn VALUES(3, 'bb', 'BBB') 
INSERT INTO @odn VALUES(3, 'cc', 'CCC') 
INSERT INTO @odn VALUES(4, 'cc', 'CCC') 

而且我的結果:

Result Set (8 items) 
orderid | orderdate   | productcode | productname | totalshippingcost 
1  | 01/01/2011 00:00:00 | aa   | AAA   | 50.25 
1  | 01/01/2011 00:00:00 | bb   | BBB   | 0.00 
1  | 01/01/2011 00:00:00 | cc   | CCC   | 0.00 
2  | 05/01/2011 00:00:00 | aa   | AAA   | 78.15 
2  | 05/01/2011 00:00:00 | bb   | BBB   | 0.00 
3  | 12/01/2011 00:00:00 | bb   | BBB   | 65.50 
3  | 12/01/2011 00:00:00 | cc   | CCC   | 0.00 
4  | 12/01/2011 00:00:00 | cc   | CCC   | 128.00 

編輯:我不開心與上述解決方案,下面是做這件事的UCH更快,更優雅的方式:

SELECT ord.orderid, ord.orderdate, ord.productcode, ord.productname, CASE WHEN row_no = 1 THEN ord.totalshippingcost ELSE 0.0 END AS totalshippingcost 
FROM 
(
SELECT ROW_NUMBER() OVER(PARTITION BY ord.orderid ORDER BY ord.orderid, ord.orderdate, odn.productcode) AS row_no, ord.orderid, ord.orderdate, odn.productcode, odn.productname, ord.totalshippingcost 
FROM OrderNew AS ord 
    INNER JOIN order_detailsnew AS odn ON odn.orderid = ord.orderid 
) ord 
ORDER BY ord.orderid, ord.orderdate, ord.productcode 

結果完美匹配。

編輯爲user580950,插入空值到每一個第二排:

您更改第一選擇線爲:

SELECT CASE D.N WHEN 1 THEN ord.orderid END AS orderid, ... 

你機會ORDER BY線爲:

CROSS JOIN (SELECT 1 UNION ALL SELECT 2) AS D(N) 
ORDER BY ord.orderid, ord.orderdate, ord.productcode, D.N 

但隨着評論說,在您的其他問題SQL Query Add an Alternate Blank Records說,這是東西,你應該在你的表示層做,而不是在數據庫中。

+0

感謝,檢查 – Nilesh

+0

這偉大工程SEPH :)你成爲明星 – Nilesh

+0

一個問題SEPH,如果我要添加備用空白記錄怎麼做呢? – user580950