2013-03-05 57 views
0

我有我的数据库的这个问题。我的代码是:选择明显错误

CREATE PROCEDURE [dbo].[test1] 
    @den nchar(14) = ''   
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @SQL AS varchar(3000) = '' 
    DECLARE @WHERE1 AS varchar(1000) = ''  
    DECLARE @ORDERBY1 AS varchar(1000) = '' 

    SET @WHERE1 = @WHERE1 + ' WHERE [dbo].table2.sag=1 ' 

    IF (@den != '')  
     SET @WHERE1 = @WHERE1 + ' AND RIGHT(''0000000000''+CONVERT(VARCHAR(10),[dbo].table1_den_id1),10) +RIGHT(''0000''+CONVERT(VARCHAR(4),[dbo].table1_den_id2),4) = ''' + RIGHT('00000000000000'+RTRIM(@den),14) + '''' 

    SET @ORDERBY1 = @ORDERBY1 + 'GROUP BY [dbo].table2.item_barcord  
ORDER BY LEFT([dbo].table2.item_barcord,13) ASC' 

    SET @SQL = @SQL + '  
      SELECT    
      DISTINCT   
      ''JAN'' + LEFT([dbo].table2.item_barcord,13) AS ''code'',    
      LEFT(MIN([dbo].table2.item_name),15) AS ''name''  
      FROM [dbo].table1   
      INNER JOIN [dbo].table2 ON [dbo].table1.id = [dbo].table2.id   '   + @WHERE1  
      + @ORDERBY1 

    DECLARE @RET AS numeric(3,0) = 0 

    EXEC(@SQL) 
    SET @RET = @@ROWCOUNT 

    RETURN @RET 
END 

但是我得到这个错误:

ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

请帮助我。

回答

1

试图改变这一行:

SET @ORDERBY1 = @ORDERBY1 + 'GROUP BY [dbo].table2.item_barcord  
ORDER BY LEFT([dbo].table2.item_barcord,13) ASC' 

要:

SET @ORDERBY1 = @ORDERBY1 + 'GROUP BY [dbo].table2.item_barcord  
ORDER BY LEFT([dbo].table2.item_barcord,13), 2 ASC' 

更多:SELECT DISTINCT and ORDER BY

1

我想你应该更改查询,所以你并不需要一个select distinct

 SELECT ''JAN'' + LEFT([dbo].table2.item_barcord,13) AS ''code'', 
     . . . 
     group by LEFT([dbo].table2.item_barcord,13) 

然后order by将正常工作。作为额外的奖励,查询将更有意义 - 聚合中的select distinct有点难以弄清楚。