Обновление по общему полю - PullRequest
1 голос
/ 28 мая 2010

У меня проблема с обновлением таблицы. следовать структуре таблицы:

Table1
  tableid
  ...
  ... 
  productID_1
  productID_2
  productID_3

Table2
  productID
  Total

Я должен суммировать каждый продукт в таблице2.

Например:

SELECT COUNT(*) as tot, ProductID_1 FROM Table1 GROUP Table1 

тогда UPDATE table2 SET total = .. ??? (как я могу это сделать) WHERE productID_1 = ....

Надеюсь, вы сможете мне помочь.

Спасибо

Ответы [ 3 ]

3 голосов
/ 28 мая 2010

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

Update Table2
Set Total = (
            Select Count(*)
            From (
                    Select productId_1 As ProductId From Table1
                    Union All Select productId_2 From Table1
                    Union All Select productId_3 From Table1
                    ) As Z
            Where Table2.ProductId = Z.ProductId
            Group By ProductId
            )

Основная причина громоздкости этого запроса заключается в том, что данные в таблице 1 не нормализованы. Вместо этого вы должны рассмотреть структуру для Table1 как:

Create Table Table1 (
                    TableId <datatype> not null
                    , ProductId <datatype> not null
                    , Constraint PK_Table1 Primary Key ( TableId, ProductId )
                    )
1 голос
/ 28 мая 2010
REPLACE INTO table2
SELECT COUNT(*) as total, ProductID 
FROM Table1 
GROUP Table1.ProductID
1 голос
/ 28 мая 2010

Вы можете сохранить первые результаты во временной таблице / переменной таблицы (если используемая БД поддерживает это). Например, в SQL Server вы можете сделать:

declare @t table
(
   key int,
   cnt int
)

insert into @t (key, cnt)
select count(*) as tot, ProductID_1 from Table1 ...

Если ProductID_2 и ProductID_3 находятся в одной таблице, вы можете объединить результаты.

Затем вставить в таблицу 2:

insert into table2 (productID, Count)
select key, cnt from @t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...