Mysql 仅SQL复杂更新查询筛选器不同值

Mysql 仅SQL复杂更新查询筛选器不同值,mysql,sql,count,sql-update,inner-join,Mysql,Sql,Count,Sql Update,Inner Join,我有3个表,其中有以下列 表:A,列:newColumnTyp1,typ2 表:B,列:类型2,表C\u id\u fk 表:C,列:id,类型1 我想通过以下逻辑从C.typ1更新A.newColumnTyp1中的值: 如果A.typ2=B.typ2和B.tableC\u id\u fk=C.id 这些值必须是不同的,如果上述任何条件给出多个结果,则应忽略。例如,A.typ2=B.typ2可能会给出多个结果,在这种情况下,应该忽略该结果。 编辑: 这些值必须是不同的,如果上述任何条件给出多个结

我有3个表,其中有以下列

表:A,列:newColumnTyp1,typ2 表:B,列:类型2,表C\u id\u fk 表:C,列:id,类型1 我想通过以下逻辑从C.typ1更新A.newColumnTyp1中的值:

如果A.typ2=B.typ2和B.tableC\u id\u fk=C.id 这些值必须是不同的,如果上述任何条件给出多个结果,则应忽略。例如,A.typ2=B.typ2可能会给出多个结果,在这种情况下,应该忽略该结果。 编辑:

这些值必须是不同的,如果上述任何条件给出多个结果,则只取一个值,忽略其余值。例如,A.typ2=B.typ2可能会给出多个结果,在这种情况下,只需取任意一个值并忽略其余值,因为A.typ2=B.typ2的所有结果都将具有相同的B.tableC_id_fk。 我试过:

SELECT DISTINCT C.typ1, B.typ2
FROM C
  LEFT JOIN B ON C.id = B.tableC_id_fk
  LEFT JOIN A ON B.typ2= A.typ2
它给出了一个包含两列typ1和typ2的表的结果 我的逻辑是,然后过滤这个新表,将type2值与A.typ2进行比较,并更新A.newColumnTyp1 我曾想过这样的事情,但失败了:

update A set newColumnTyp1= (
SELECT C.typ1 from
SELECT DISTINCT C.typ1, B.typ2
FROM C
  LEFT JOIN B ON C.id = B.tableC_id_fk
  LEFT JOIN A ON B.typ2= A.type2 
where A.typ2=B.typ2);

我正在考虑可更新的CTE和窗口功能:

with cte as (
    select a.newColumnTyp1, c.typ1, count(*) over(partition by a.typ2) cnt
    from a
    inner join b on b.type2 = a.typ2
    inner join c on c.id = b.tableC_id_fk
)
update cte
set newColumnTyp1 = typ1
where cnt > 1
更新:如果列具有相同的名称,则将其中一个列别名为:

with cte as (
    select a.typ1, c.typ1 typ1c, count(*) over(partition by a.typ2) cnt
    from a
    inner join b on b.type2 = a.typ2
    inner join c on c.id = b.tableC_id_fk
)
update cte
set typ1 = typ1c
where cnt > 1

我想我会这样做:

update a
    set newColumnTyp1 = bc.min_typ1
    from (select b.typ2, min(c.typ1) as min_typ1, max(c.typ1) as max_typ1
          from b join
               c
               on b.tableC_id_fk = c.id
          group by b.type2
         ) bc
     where bc.typ2 = a.typ2 and
           bc.min_typ1 = bc.max_typ1;
子查询确定typ1是否始终相同。如果是,则用于更新


我应该注意到,您可能希望分配最常见的值,而不是要求一致性。如果这就是你想要的,那么你可以问另一个问题。

@StackDummy:好的。再次查看我的更新谢谢,我尝试了:使用cte选择a.newColumnTyp1作为atyp1,c.typ1作为ctyp1,计数*a.typ2 cnt从b.type2=a.typ2上的内部联接b到c.id=b.tableC_id\u fk更新cte设置为atyp1=btyp1,其中cnt>1