Вопрос SQL: Как применить изменения к аналогичным строкам на основе значения одной строки - PullRequest
0 голосов
/ 02 июля 2011

В моей БД SQL Server 2008 у меня есть таблица с записями вроде этого:

ID 1 | Group1 | \ftp\path\group1\file1.txt
ID 2 | Group1 | C:\local\file\path\group1\file1.txt
ID 3 | Group1 | C:\local\file\path\group1\file1.txt
ID 4 | Group1 | C:\local\file\path\group1\file1.txt
ID 5 | Group2 | \ftp\path\group2\file1.txt
ID 6 | Group2 | C:\local\file\path\group2\file1.txt
ID 7 | Group2 | C:\local\file\path\group2\file1.txt

Мне нужно обновить таблицу, чтобы она выглядела так:

ID 1 | Group1 | \ftp\path\group1\file1.txt
ID 2 | Group1 | \ftp\path\group1\file1.txt
ID 3 | Group1 | \ftp\path\group1\file1.txt
ID 4 | Group1 | \ftp\path\group1\file1.txt
ID 5 | Group2 | \ftp\path\group2\file1.txt
ID 6 | Group2 | \ftp\path\group2\file1.txt
ID 7 | Group2 | \ftp\path\group2\file1.txt

Я просто не знаю, как это начать.Мне легко найти значения в третьем столбце, потому что они соответствуют этому шаблону:%: \%.

Итак, я пытаюсь заменить значение в тех полях, которые соответствуют этому шаблону, на правильное значение в записи, которая не соответствует этому шаблону.Блин, это так сложно объяснить.

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

Есть идеи?Я ценю помощь.

Ответы [ 2 ]

2 голосов
/ 02 июля 2011

Это дает результаты, которые вы показываете, но я не думаю, что применяемые мной правила соответствуют тому, как вы описали, как вы попали сюда.Вы говорите о подстановочном знаке "%: \%", но я не вижу ничего в данных, которые выглядят так.

DECLARE @foo TABLE
(
    ID VARCHAR(32) PRIMARY KEY, 
    [Group] VARCHAR(32), 
    Val VARCHAR(32)
);

INSERT @foo SELECT   'ID 1','Group1','Value 1'
    UNION ALL SELECT 'ID 2','Group1','Value 2'
    UNION ALL SELECT 'ID 3','Group1','Value 3'
    UNION ALL SELECT 'ID 4','Group1','Value 4'
    UNION ALL SELECT 'ID 5','Group2','A Different Value 1'
    UNION ALL SELECT 'ID 6','Group2','A Different Value 2'
    UNION ALL SELECT 'ID 7','Group2','A Different Value 3';

SELECT ID, [Group], Val FROM @foo;

WITH x AS 
(
    SELECT 
        ID, [Group], Val, 
        rn = ROW_NUMBER() OVER (PARTITION BY [Group] ORDER BY val)
    FROM @foo
)
UPDATE x
    SET x.Val = y.Val
    FROM x 
    INNER JOIN x AS y
    ON x.[Group] = y.[Group]
    WHERE y.rn = 1 AND x.rn > 1;

SELECT ID, [Group], Val FROM @foo;
1 голос
/ 02 июля 2011

Что-то вроде этого может быть?

UPDATE table
SET table.valueColumn = CT.correctValueColumn
FROM table as CT
    INNER JOIN table as IT on IT.group = CT.group AND CT.valueColumn LIKE '%:\%'
WHERE IT.valueColumn NOT LIKE '%:\%'

У меня нет управляющей студии на этой машине, поэтому я не уверен, что она синтетически верна.

Надеюсь, это поможет некоторым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...