【问题标题】:Subquery returns more than 1 value SQL error on multiple selection子查询在多选时返回超过 1 个值 SQL 错误
【发布时间】:2013-06-25 14:46:26
【问题描述】:

我想要一个临时表,它可以使用 select 语句插入值。但是每次我运行查询,我总是得到错误

子查询返回超过 1 个值。当查询跟随 =、!=、、>= 或将子查询用作表达式时,这是不允许的。该语句已终止。 (0 行受影响)

这很奇怪,因为代码中似乎没有错误。但如果有,请纠正我。

这是查询:

DECLARE @tblKeywords TABLE (Keyword1 VARCHAR(MAX), Keyword2 VARCHAR(MAX), Keyword3 VARCHAR(MAX))

Insert into @tblKeywords (Keyword1, Keyword2, Keyword3)
Values(
(Select k from 
(Select Keyword k, ROW_NUMBER() OVER (ORDER BY KeywordID) AS RowNum from t_SMSKeyword) as mytable
where mytable.RowNum BETWEEN 1 and 3),

(Select kk from 
(Select Keyword kk, ROW_NUMBER() OVER (ORDER BY KeywordID) AS RowNum from t_SMSKeyword) as mytable
where mytable.RowNum BETWEEN 4 and 6),

(Select kkk from 
(Select Keyword kkk, ROW_NUMBER() OVER (ORDER BY KeywordID) AS RowNum from t_SMSKeyword) as mytable
where mytable.RowNum BETWEEN 7 and 9)
)

Select * from @tblKeywords

【问题讨论】:

  • 您是否单独触发了子查询?如果是,那么每个子查询的行数是多少?
  • @Brenelyn :您有三个子查询。其中一个或多个返回多于一行。于是问题就来了。尝试分别运行每个子查询,你会发现问题。
  • 单独运行查询时效果很好。但我想在一个查询中得到结果,所以我可以把它们放在 asp:gridview 中。
  • 例如,当您有 1 到 3 行时,这会给您三行而不是一行。你觉得有必要加TOP 1吗?
  • @Edper,是的,它给了我三行。

标签: sql sql-server database select insert


【解决方案1】:

在 SQLServer2005+ 中,您可以使用带有common table expression 的选项

DECLARE @tblKeywords TABLE (Keyword1 VARCHAR(MAX), Keyword2 VARCHAR(MAX), Keyword3 VARCHAR(MAX))

;WITH cte AS
 (      
  SELECT Keyword, ROW_NUMBER() OVER (ORDER BY KeywordID) AS RowNum       
  FROM dbo.t_SMSKeyword  
  )
  INSERT @tblKeywords(Keyword1, Keyword2, Keyword3)
  SELECT c1.Keyword, c2.Keyword, c3.Keyword
  FROM cte c1 JOIN cte c2 ON c1.RowNum + 3 = c2.RowNum
              JOIN cte c3 ON c2.RowNum + 3 = c3.RowNum
  WHERE c1.RowNum BETWEEN 1 and 3 

查看SQLFiddle上的示例

在第一列中选​​择 4 行,在其他列中选择 3 行

DECLARE @tblKeywords TABLE (Keyword1 VARCHAR(MAX), Keyword2 VARCHAR(MAX), Keyword3 VARCHAR(MAX))
;WITH cte AS
 (      
  SELECT Keyword, ROW_NUMBER() OVER (ORDER BY KeywordID) AS RowNum       
  FROM dbo.t_SMSKeyword  
  )
  INSERT @tblKeywords(Keyword1, Keyword2, Keyword3)
  SELECT c1.Keyword, c2.Keyword, c3.Keyword
  FROM cte c1 LEFT JOIN cte c2 ON c1.RowNum + 4 = c2.RowNum AND c2.RowNum < 8
              LEFT JOIN cte c3 ON c2.RowNum + 3 = c3.RowNum
  WHERE c1.RowNum BETWEEN 1 and 4

SELECT *
FROM @tblKeywords

第二种解决方案的示例SQLFiddle

【讨论】:

  • 谢谢!它工作得很好..但我可以问是否可以在第一列中选​​择 4 行,然后在其他列中选择 3 行?再次感谢你:)
【解决方案2】:

您将通过以下查询获得所需的结果

SQLFIDDLE

DECLARE @tblKeywords TABLE (Keyword1 VARCHAR(MAX), Keyword2 VARCHAR(MAX), Keyword3 VARCHAR(MAX))

Insert into @tblKeywords (Keyword1, Keyword2, Keyword3)
 select k,kk,kkk from 
(Select k, RowNum from 
(Select Keyword k, ROW_NUMBER() OVER (ORDER BY KeywordID) AS RowNum from t_SMSKeyword) as mytable
where mytable.RowNum BETWEEN 1 and 3) a,

(Select kk, RowNum from 
(Select Keyword kk, ROW_NUMBER() OVER (ORDER BY KeywordID) AS RowNum from t_SMSKeyword) as mytable
where mytable.RowNum BETWEEN 4 and 6) b,

(Select kkk,RowNum from 
(Select Keyword kkk, ROW_NUMBER() OVER (ORDER BY KeywordID) AS RowNum from t_SMSKeyword) as mytable
where mytable.RowNum BETWEEN 7 and 9) c

where a.RowNum = b.RowNum-3
and a.RowNum = c.RowNum-6;

Select * from @tblKeywords;

【讨论】:

    【解决方案3】:

    试试这个

    DECLARE @tblKeywords TABLE
        (
          Keyword1 VARCHAR(MAX) ,
          Keyword2 VARCHAR(MAX) ,
          Keyword3 VARCHAR(MAX)
        )
    
    INSERT  INTO @tblKeywords
            ( Keyword1 ,
              Keyword2 ,
              Keyword3
            )
            SELECT  k ,
                    ( SELECT    kk
                      FROM      ( SELECT    e.Keyword AS kk ,
                                            ROW_NUMBER() OVER ( ORDER BY e.KeywordID ) AS RowNum1
                                  FROM      t_SMSKeyword AS e
                                ) AS Emp1
                      WHERE     Emp1.RowNum1 = ( RowNum + 3 )
                    ) ,
                    ( SELECT    kkk
                      FROM      ( SELECT    e.Keyword AS kkk ,
                                            ROW_NUMBER() OVER ( ORDER BY e.KeywordID ) AS RowNum1
                                  FROM      t_SMSKeyword AS e
                                ) AS Emp1
                      WHERE     Emp1.RowNum1 = ( RowNum + 6 )
                    )
            FROM    ( SELECT    e.Keyword AS k ,
                                ROW_NUMBER() OVER ( ORDER BY e.KeywordID ) AS RowNum
                      FROM      t_SMSKeyword AS e
                    ) AS mytable
            WHERE   mytable.RowNum BETWEEN 1 AND 3
    
    
    
    
    
    
    
    SELECT  *
    FROM    @tblKeywords
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多