2009-11-07 5 views
2

У меня есть следующая таблица, которую я хочу обновить, используя другую таблицу, приведенную ниже. alt text http://img94.imageshack.us/img94/4602/leisureoriginal.pngОбновление строки таблицы Использование данных из нескольких столбцов другой таблицы

Я хочу обновить значения Null из приведенной выше таблицы, используя следующую таблицу на основе ProductId. alt text http://img264.imageshack.us/img264/512/datatable2.png

Обновленная таблица должна быть такой. alt text http://img690.imageshack.us/img690/9585/updatedtable.png

Я упомянул ProductId в этой таблице только, например. Я не знаю точного ProductId. Это может быть любой ProductId.

Я знаю FieldId и FieldValue заранее во 2-й таблице.

Могу ли я сделать это в одной инструкции UPDATE для всех столбцов.

+0

вы можете перечислить все имена столбцов как таблицы источника и назначения имен – Jebli

+0

столбцов в заголовке, в изображениях. Исходная таблица - вторая, а таблица назначения - первая. – Kashif

ответ

1

В SQL Server ключевое слово PIVOT превращает строки в столбцы. Нам нужны два PIVOT, один для FieldId и один для FieldValue. Ключевое слово ;WITH (которому предшествует точка с запятой, чтобы отличить ее от несвязанной команды WITH ROLLUP) позволяет нам использовать создаваемые «временные представления», которые мы используем позже в инструкции UPDATE.

;WITH FieldIds AS (SELECT * FROM (SELECT ProductId, FieldId FROM ProductFields) A 
        PIVOT (MAX(FieldId) FOR FieldId IN ([50], [55], [60])) AS B), 
     FieldValues AS (SELECT * FROM ProductFields 
         PIVOT (MAX(FieldValue) FOR FieldId IN ([50], [55], [60])) AS C) 
UPDATE Products 
SET 
    RatingId = FieldIds.[50], 
    Rating = FieldValues.[50], 
    LeisureId = FieldIds.[55], 
    Leisure = FieldValues.[55], 
    SpaId = FieldIds.[60], 
    Spa = FieldValues.[60] 
FROM Products 
INNER JOIN FieldIds ON FieldIds.ProductId = Products.ProductId 
INNER JOIN FieldValues ON FieldValues.ProductId = Products.ProductId 
0

В SQL Server оператор UPDATE допускает предложение FROM с JOINS. Например, в этом запросе будет обновлено поле «Оценка»:

UPDATE  p 
SET   p.Rating = pf.FieldValue 
FROM  Products p 
INNER JOIN ProductField pf 
ON   pf.ProductId = p.ProductId 
WHERE  pf.FieldId = 50 

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

0

Может быть что-то вроде этого:

Update T1 
Set T1.RatingID = T2.FieldID, 
T1.Rating = T2.FieldValue 
From Table1 T1 
Inner JOin Table2 T2 
On T1.ProductID = T2.ProductID 
Where T2.FieldID = 50 

Чтобы изменить все столбцы сразу, вам нужно будет использовать подзапросы:

Update T1 
Set T1.RatingID = (Select T2.FieldID 
        From Table2 T2 
      Where T2.FieldID = 50 
      And T2.ProductID = T1.ProductID) 
From Table1 T1 
0

Вам сначала нужно превратить вашу вторую таблицу таким образом, чтобы она содержит только одну строку на ProductID.

SELECT t1.ProductID, t1.FieldID AS RatingID, t1.FieldValue AS Rating, 
     t2.FieldID AS LeisureID, t2.FieldValue AS Leisure, etc. 
FROM SecondTable t1 
LEFT OUTER JOIN SecondTable t2 
     ON t1.ProductID = t2.ProductID 
     AND t2.FieldValue = 55 
LEFT OUTER JOIN SecondTable t3 
     ON t1.ProductID = t3.ProductID 
     AND t3.FieldValue = 60 
WHERE t1.FieldValue = 50 

Затем вы можете обновить все столбцы в первой таблице из этой таблицы в одном запросе обновления. Обратите внимание, что вы можете сделать приведенную выше таблицу View of the Second, так что это будет проще использовать позже. (Назовем это SecondTableView на данный момент, кстати, теперь он имеет точную форму первой таблицы).

UPDATE FirstTable 
SET RatingID = t1.RatingID, Rating = t1.Rating, etc. 
FROM SecondTableView t1 
WHERE FirstTable.ProductID = t1.ProductID 

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

Смежные вопросы