0

在疯狂地试图弄清楚如何正确地写这个之后,我有点想在这里扔冰雹玛丽。我已经四处搜寻,但还没有找到让我“点击”的东西。

情况如下:有 3 个表(括号中涉及的列):

  • 产品 (prod_id PK, prod_grp_id)
  • prod_grps (prod_grp_id PK, prod_grp_mgr_nm)
  • prod_grp_prods (prod_id, prod_grp_id)

一个产品可以属于多个 prod_grp。例如,棒球可以在运动 prod_grp 中,它可能具有 prod_grp_mgr_nm = "AssMGR_Bill",同时也可以在 general_merch 组中,具有 prod_grp_mgr_nm = "LeadMGR_Jake"。我需要遍历 prods 表中的每个项目并更新每个项目的“prod_grp_id”值,以便它包含由 prod_grp_mgr_nm 中具有“LeadMGR”的人管理的 prod_group_id。仅当只有一个 prod_grp 且 prod_grp_mgr_nm 包含“LeadMGR”时,我才想更新 prods。此处的目标是将每个 prod 与由牵头经理管理的组相关联(如果存在一个(并且只有一个))。

到目前为止,我有这个 SELECT 语句:

    SELECT prods.prod_id
    FROM prods p
    INNER JOIN prod_grp_prods pgp
    ON prod.prod_id = pgp.prod_id
    INNER JOIN prod_grps pg
    ON pgp.prod_grp_id = pg.acct_grp_id
    WHERE pg.prod_grp_mgr_nm LIKE '%LeadMGR%'
    GROUP BY p.prod_id HAVING COUNT(p.prod_id) = 1
    ORDER BY p.prod_id`

这将返回所有需要更新的 prod_id。

4

3 回答 3

0

此查询将解决您的基本问题。

alter table prods
drop column prod_grp_id

正如您所描述的,产品和组之间存在多对多关系。您还有表 prod_grp_prods 来实现该关系。在您的产品表中有一个组 id 字段非常简单,是个坏主意。

编辑从这里开始

这是一个创可贴解决方案

update p
set prod_grp_id = pgp.prod_grp_id
from prods p join prod_grp_prods pgp on p.prod_id = pgp.prod_id
join (
select prod_id, count(*) records
from prod_grp_prods 
group by prod_id
having count(*) = 1) temp on temp.prod_id = p.prod_id

您将需要另一个查询来取消其他记录。

于 2013-10-03T00:36:34.177 回答
0
 UPDATE prods
 SET    prod_grp_id = BS.prod_grp_id
 FROM   (
          SELECT prods.prod_id,
                 pgp.prod_grp_id

          FROM   prods p 

                 INNER JOIN prod_grp_prods pgp ON 
                 prod.prod_id = pgp.prod_id 

                 INNER JOIN prod_grps pg ON 
                 pgp.prod_grp_id = pg.acct_grp_id 

          WHERE  pg.prod_grp_mgr_nm LIKE '%LeadMGR%' 

          GROUP BY 
                 p.prod_id,
                 pgp.prod_grp_id 

          HAVING COUNT(p.prod_id) = 1 
     ) BS

  WHERE prods.prod_id = BS.prod_id
于 2013-10-03T01:39:55.307 回答
0

我试图用以下查询复制您的问题。我使用子查询来更新 prods 表。我希望这确实复制了您的问题。

create table #prods (prod_id int PRIMARY KEY, prod_grp_id int)
create table #prod_grps (acct_grp_id int PRIMARY KEY, prod_grp_mgr_nm varchar(200))
create table #prod_grp_prods (prod_id int , prod_grp_id int)

-- insert testing data
insert into #prods values (1, null), (2,null), (3, null)
insert into #prod_grps values (999, 'AssMGR_Bill'), (998, 'LeadMGR_Jake'), (995, 'LeadMGR_Jake')
insert into #prod_grp_prods values (1, 999), (2, 995), (3, 999), (1,998)

-- original query
SELECT p.prod_id, pgp.prod_grp_id
    FROM #prods p
    INNER JOIN #prod_grp_prods pgp
    ON p.prod_id = pgp.prod_id
    INNER JOIN #prod_grps pg
    ON pgp.prod_grp_id = pg.acct_grp_id
    WHERE pg.prod_grp_mgr_nm LIKE '%LeadMGR%'
    GROUP BY p.prod_id , pgp.prod_grp_id
    HAVING COUNT(p.prod_id) = 1
    ORDER BY p.prod_id

-- update query
update #prods set prod_grp_id = t.prod_grp_id
from 
(
  SELECT p.prod_id, pgp.prod_grp_id
    FROM #prods p
    INNER JOIN #prod_grp_prods pgp
    ON p.prod_id = pgp.prod_id
    INNER JOIN #prod_grps pg
    ON pgp.prod_grp_id = pg.acct_grp_id
    WHERE pg.prod_grp_mgr_nm LIKE '%LeadMGR%'
    GROUP BY p.prod_id , pgp.prod_grp_id
    HAVING COUNT(p.prod_id) = 1

)t  
where t.prod_id = #prods.prod_id

-- view results
select * from #prods
于 2013-10-03T16:49:53.987 回答