2011-09-26 8 views
-2

J'ai écrit une requête qui fonctionne très bien sur mon SQL Server 2005 local. J'ai téléchargé la requête sur mon serveur d'hébergement et d'une certaine manière ils disent que la création de table temporaire est désactivée sur leur serveur.Requête SQL sans table temporaire

Ma requête ressemble à ceci

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 

donc pas sûr que cette requête peut être écrite sans une table temporaire, etc joint ne sais pas si cela va fonctionner? Un conseil?

+1

Qu'essayez-vous de faire. Pouvez-vous expliquer votre configuration et votre objectif db? – Dave

Répondre

1

Je suppose que cette requête doit être insérée dans un rapport, c'est pourquoi vous ne voulez qu'une seule fois le coût total d'expédition, alors que vous n'avez pas besoin de table temporaire pour cette référence, vous pouvez toujours:

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) 
) 

et utiliser @tmp plutôt que #tmp

Mais vous ne devriez pas avoir besoin d'un voir pour cela, table temporaire ci-dessous:

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 

fonctionne bien pour moi avec le foll script de test en raison:

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') 

Et mes résultats:

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 

edit: je ne suis pas satisfait de la solution ci-dessus, voici une UCH façon plus rapide et plus élégante de le faire:

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 

Les résultats correspondent parfaitement.

Modifier pour user580950, pour insérer des valeurs nulles dans chaque seconde rangée:

Vous modifiez la première ligne SELECT être:

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

Et vous chance ORDER BY ligne être:

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

Mais comme les commentaires disent dans votre autre question SQL Query Add an Alternate Blank Records, c'est quelque chose que vous devriez faire à votre couche de présentation et non dans la base de données.

+0

merci, vérifiant – Nilesh

+0

Cela fonctionne Great Seph :) vous une étoile – Nilesh

+0

Encore une question Seph, si je dois ajouter d'autres dossiers vierges comment puis-je faire cela? – user580950

Questions connexes