[英]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.