Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как написать COUNT в INSERT INTO SELECT  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
Имею вот такой не рабочий SQL

INSERT INTO t1 (
	c1
	,c2
	,c3
	)
SELECT c1
	,c2
	,(
		SELECT TOP 1 id
		FROM t2
		WHERE cnt < (
				SELECT count(*)
				FROM t1
				WHERE c3 = t2.id
				)
		)
FROM t3


т.е. проставить c3 значения из t2.id пока их не больше чем cnt у t2.id



Имеем

t2
id cnt
1 2
2 3

знаем что Select Sum(cnt) from t2 равно Select count(*) from t3


хотим получить

t1

c1 c2 c3
- - 1
- - 1
- - 2
- - 2
- - 2

Что выдает сейчас:


t1

c1 c2 c3
- - 1
- - 1
- - 1
- - 1
- - 1
12 ноя 13, 17:05    [15116848]     Ответить | Цитировать Сообщить модератору
 Re: Как написать COUNT в INSERT INTO SELECT  [new]
Glory
Member

Откуда:
Сообщений: 104751
INSERT INTO t1 (
	c1
	,c2
	,c3
	)
SELECT c1
	,c2
        , t2.id
FROM t3 JOIN t2 ON t2.cnt <= t3.f1
12 ноя 13, 17:10    [15116886]     Ответить | Цитировать Сообщить модератору
 Re: Как написать COUNT в INSERT INTO SELECT  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Попробуй так

Может и коряво написано, но выдаёт нужный результат.

BEGIN TRAN

CREATE TABLE t1(c1 CHAR(1), c2 CHAR(1), c3 INT);
CREATE TABLE t2(ID INT, cnt INT);
CREATE TABLE t3(c1 CHAR(1), c2 CHAR(1));
INSERT INTO t2(ID, CNT) VALUES (2,3), (1,2), (3,1)--, (4,5)
INSERT INTO t3(c1, c2) VALUES ('A','B'), ('A','B'), ('A','B'), ('A','B'), ('A','B'), ('A','B'), ('A','B'), ('A','B'), ('A','B'), ('A','B');

WITH t4 AS (
  SELECT ID, cnt, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) AS RealCount
  FROM t3, t2
  ),
  t5 AS ( 
    SELECT ID, ROW_NUMBER() OVER (PARTITION BY '' ORDER BY ID) AS OrderNumber 
    FROM t4 
    WHERE RealCount <= cnt),
  t6 AS (SELECT c1, c2, ROW_NUMBER() OVER (PARTITION BY '' ORDER BY c1 DESC) AS OrderNumber FROM t3)
INSERT INTO t1(c1, c2, c3)
SELECT t6.c1, t6.c2, t5.ID 
FROM t6 LEFT JOIN t5 ON t6.OrderNumber = t5.OrderNumber

SELECT * FROM t1

ROLLBACK


PS Если количество возможных значений из t2 будет меньше чем записей в t3, то в поле с3 пойдёт NULL.
12 ноя 13, 21:07    [15118031]     Ответить | Цитировать Сообщить модератору
 Re: Как написать COUNT в INSERT INTO SELECT  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
Glory,

в t3 нет f1
t2.cnt сравнивается именно с SELECT count(*) FROM t1
13 ноя 13, 09:13    [15119255]     Ответить | Цитировать Сообщить модератору
 Re: Как написать COUNT в INSERT INTO SELECT  [new]
_Groxot_
Member

Откуда: Оттуда
Сообщений: 481
SandalTree,

Отлично, только конструкции используемые в запросе, не поддерживаются SQL 2000)
Но все-равно огромное спасибо!
13 ноя 13, 10:10    [15119522]     Ответить | Цитировать Сообщить модератору
 Re: Как написать COUNT в INSERT INTO SELECT  [new]
Glory
Member

Откуда:
Сообщений: 104751
_Groxot_
в t3 нет f1

Поставьте то поле, которе есть. Или нужно угадать структуру этой таблицы ?
_Groxot_
t2.cnt сравнивается именно с SELECT count(*) FROM t1

Для задачи "размножения" записей нужна простая таблица с монотонно возрастающими числами
13 ноя 13, 10:12    [15119533]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить