0
USE [cms]
GO
/****** Object:  StoredProcedure [dbo].[SpCateProductsInfo]    Script Date: 10/14/2012 00:50:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[SpCateProductsInfo](@cate_id int)
as
begin
select sb.subcate_name, sum(p.qty) as totalqty, 
(select top 1 pimg_mid1 from product join subcategory
on product.subcate_id=
(
    select top 1 subcate_id
    from subcategory
    where cate_id=@cate_id
    order by NEWID()
)
order by NEWID()) as pimg_mid1
from subcategory sb 
  join product p on p.subcate_id = sb.subcate_id
where sb.cate_id = @cate_id
group by sb.subcate_name


end

f9 で動作していますが、問題は pimg_mid1 列に同じエントリが含まれていることです ( pimg_mid1 列に関するすべての行に同じデータが含まれています) 。

誰でもこのエラーと解決策を教えてもらえますか???

4

1 に答える 1

1

pimg_mid1 は以下に基づいているため:

SELECT TOP 1 PIMG_MID1 
FROM   PRODUCT 
       JOIN SUBCATEGORY 
         ON PRODUCT.SUBCATE_ID = (SELECT TOP 1 SUBCATE_ID 
                                  FROM   SUBCATEGORY 
                                  WHERE  CATE_ID = @cate_id 
                                  ORDER  BY Newid()) 
ORDER  BY Newid() 

このサブクエリは、アタッチされている個々の行の影響を受けず、常に同じ結果を返します。

それを行う「正しい」方法は、次のようなものです。

SELECT t1.COLA, 
       T1.COLB, 
       T2.COLZ 
FROM   (SELECT *, 
               Row_number() 
                 OVER ( 
                   ORDER BY COLA) RN 
        FROM   MAIN)T1 
       INNER JOIN(SELECT COLZ, 
                         Row_number() 
                           OVER ( 
                             ORDER BY Newid()) RN 
                  FROM   RANDOM)T2 
               ON T1.RN = T2.RN 

こちらのSQL Fiddleの例を参照してください。

于 2012-10-14T21:15:54.863 に答える