2013-09-25 4 views
4

Я хочу взять столбец со значениями, которые повторяются несколько раз, и получить это значение только один раз и сохранить его для последующего использования, но в то же время я хотел бы получить другое значение в том же как этот отдельный столбец.Значения SELECT DISTINCT и INSERT INTO

A  B  C 
32263 123456 44 
32263 123456 45 
32263 123456 46 
32264 246802 44 
32263 246802 45 
32264 246802 46 
32265 369258 44 
32265 369258 45 
32265 369258 46 

A, B, C представляют собой три колонны. Игнорировать C на данный момент.

Мой вопрос: Как я могу получить эту информацию в этой таблице и сохранить ее, чтобы использовать ее позже в скрипте?

Вот что я пробовал:

use databaseName 

select distinct A from tableName 
order by A 

Результат:

A 
32263 
32264 
32265 

Я пытаюсь заставить его также дать мне значение Б. (Обратите внимание, что не имеет значения, с какой строки я получаю, так как независимо от того, какой A я выбираю, значение B будет таким же для данного A.) Мы игнорируем C на данный момент.

Результат должен быть:

A  B 
32263 123456 
32264 246802 
32265 369258 

Теперь, когда я понял, как я хочу, чтобы вставить строку, используя значения, которые я получил из запроса. Это где C приходит я хочу сделать что-то вроде этого:.

use databaseName 

insert into tableName (A, B, C) 
values (32263, 123456, 47) 

Конечно, я не хочу, чтобы поместить значения непосредственно внутри там, вместо того, чтобы иметь некоторый тип цикла, который будет перебирать каждый из 3 различных значения A, которые я нашел.

Короче говоря, мой стол должен идти от:

A  B  C 
32263 123456 44 
32263 123456 45 
32263 123456 46 
32264 246802 44 
32263 246802 45 
32264 246802 46 
32265 369258 44 
32265 369258 45 
32265 369258 46 

To:

A  B  C 
32263 123456 44 
32263 123456 45 
32263 123456 46 
32263 123456 47 - 
32264 246802 44 
32263 246802 45 
32264 246802 46 
32264 246802 47 - 
32265 369258 44 
32265 369258 45 
32265 369258 46 
32265 369258 47 - 

Я поставил тире рядом с вновь добавленных строк, чтобы помочь вам увидеть изменения.

Я полагаю, что я должен сделать какой-то цикл, который будет циклически проходить через все три различных значения A, но моя проблема заключается в том, как это сделать?

Спасибо за ваше время.

+0

Там в странствующих '32263' в середине' 32264' секции. –

ответ

8

Вы можете использовать INSERT INTO... SELECT заявление по этому вопросу,

INSERT INTO tableName (A, B, C) 
SELECT A, B, MAX(C) + 1 
FROM tableName 
GROUP BY A, B 
+0

Скрипка: http://sqlfiddle.com/#!6/be579/1/0 –

+1

Очень полезно, спасибо вам большое! – JohnAtrik

0

Если я понимаю, что вы пытаетесь правильно выполнить, вы должны быть в состоянии сделать это:

INSERT INTO Table 
SELECT A, B, MAX(C) + 1 
FROM Table 
GROUP A, B 

Это должно вставить строку для каждого d istinct комбинация A и B, а также прирост C.

0

Это можно сделать с помощью оконных функций.

INSERT INTO TABLENAME (A, B, C) 
SELECT A, B, C + 1 
FROM(
select A, B, C, MAX(C) OVER(PARTITION BY A, B) AS MAXC 
FROM TABLENAME 
) AS NEW_ROWS 
WHERE C = MAXC 
+0

Это добавит много дубликатов, OP просто хочет 1 строку для каждой группы. –

+0

@GoatCO Обновлен мой запрос для фильтрации. Группа будет работать большую часть времени, пока вы просто не захотите группировать А. Просто хотел ввести функцию окон, так как они очень полезны. – Vulcronos

0

Попробуйте это:

SELECT * INTO new_table FROM 
    (SELECT DISTINICT * FROM table_name) x 
Смежные вопросы