繁体   English   中英

SQL自加入-SQL和Access

[英]SQL self join - SQL and Access

表格1

ID 代码 决定
1个 TK01 是的
2个 OP01 ---
3个 TK01 ---
4个 MK02 是的
5个 MK02 ---

嗨,伙计们,如果在代码列中发现重复项,什么 SQL 查询将更新决策列。

换句话说:代码为 TK01 的 ID 1 具有“是”,因此 ID 3 应在“决策”列中更新为“是”值。

与 ID 5 相同,因为它与 ID 4 的代码匹配,并且 ID 4 在Decision列中具有“Yes”值。

我已经在 Access 中创建了它(下面的代码)但是如何在 t-sql 或 mysql 中创建它

UPDATE Table1 t1 INNER JOIN Table1 t2
ON t1.Code = t2.Code
SET t1.Decision  = t2.Decision

在 T-SQL 中,我会使用可更新的 CTE来做到这一点。 使用分析函数,获得正确的决策值并识别重复的代码,然后只更新那些重复的代码:

with u as (
    select *,
      Max(decision) over(partition by code) v, 
      Count(*) over(partition by code) cnt
    from t
)
update u
set decision = v
where cnt > 1 and decision = '---'

tsql:

UPDATE t1 SET t1.Decision = 'Yes' FROM Table1 t1 INNER JOIN Table1 t2 ON t1.Code = t2.Code
WHERE t1.Decision <> t2.Decision

您可以通过在块中添加 UPDATE 语句来查看预期结果而不执行它

BEGIN TRAN
SELECT * FROM Table1

UPDATE t1 SET t1.Decision = 1 FROM Table1 t1 
INNER JOIN Table1 t2 ON t1.Code = t2.Code
WHERE t1.Decision <> t2.Decision

SELECT * FROM Table1

ROLLBACK TRAN

这应该有效:

UPDATE a
SET decision = 'Yes'
FROM table1 AS a
   INNER JOIN table1 AS b
       ON a.code = b.code
          AND (a.decision = 'Yes' OR b.decision = 'Yes');  

不过,您应该规范化您的表格。 如果决策仅取决于代码,则应考虑将决策列移至新表,因此您将拥有两个表U(ID, Code)V(Code, Decision)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM