2011-09-26 72 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