2013-06-24 4 views
1

Я хотел иметь временную таблицу, которая будет вставлять значения с помощью операторов select. Но каждый раз, когда я запускал запрос, я всегда получал ошибкуПодзапрос возвращает более 1 значения Ошибка SQL при множественном выборе

Подзапрос возвращает более 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 
+0

Вы запускали подзапросы отдельно? Если да, то какой был rowcount для каждого подзапроса? – Romesh

+0

@Brenelyn: У вас есть три подзапроса. Один или несколько из них возвращают несколько строк. Так возникает проблема. Попробуйте запустить каждый подзапрос отдельно, вы найдете проблему. –

+0

Работает нормально, когда я запускал запросы отдельно. Но я хочу получить результаты только в одном запросе, поэтому я могу поместить их в asp: gridview. – Brenelyn

ответ

2

В 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

+0

спасибо! Он отлично работает .. но могу ли я спросить, можно ли выбрать 4 строки в первом столбце, а затем 3 строки для других столбцов? Еще раз спасибо :) – Brenelyn

+0

Нет проблем;) Ответ обновлен ... –

0

Вы получите желаемый результат с помощью следующего запроса

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; 
0

попробовать этот

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