使用 join 和 group with count 进行更新
Update using join and group with count
我可以根据第二个 table 中的计数在 table 之间进行更新,如下所示:
Update TableJ J
Inner Join (Select B_ID,C,S from TableC group by C,S having count=1) C
On J.C=C.C and J.S=C.S
Set T1.B_ID=T2.B_ID
问题是我的 TableC 不包含 S
,它存储在另一个 table 中并通过 B
关联,称之为 Table_BS
(请不要开玩笑:| ).如果我不必担心计数,那么我可以这样做:
Update TableJ J
Inner Join TableC C
Inner Join TableBS BS
On J.C=C.C and C.S=BS.S
Set J.B_ID=BS.B_ID
除了问题是,与原始计数一样,当只有一个 C
记录和 S
记录时,我只想 return B_ID
TableBS
.
更新:
好吧,这就是我取得的进展(select 明智):
Select J.ID,B.B_ID
From DBJ J Inner Join LBS B Inner Join C
On J.C=C.C And (
J.S_ID = B.S_ID
or J.S_ID=B.CS_ID)
and B.B_ID=C.B_ID
在我的例子中 returns 三个记录:
+----+------+
| ID | B_ID |
+----+------+
| 88 | 100 |
+----+------+
| 90 | 200 |
+----+------+
| 90 | 200 |
+----+------+
ID 是我要更新的记录,B_ID 是我要更新的值。在这种情况下,结果是我试图限制的计数是输出中的 ID 列,换句话说,我只想更新 TableJ,记录 88 的值为 100。TableJ 记录 90 原来有 >1 个结果,所以我想跳过它。只是不确定将 group by
或 count
放在哪里。
更新:虽然越来越接近,但不确定为什么这个解决方案仍然超出我的掌握范围,我可以获得 select 到现在 return 要更新的记录的 ID 和要更新的值仅在那些有一个结果的记录上:
Select J.ID,B.B_ID
From DBJ J Inner Join LBS B Inner Join C
On J.C=C.C And (
J.S_ID = B.S_ID
or J.S_ID=B.CS_ID)
and B.B_ID=C.B_ID group by J.ID having count(*)=1
哪个return
+----+------+
| ID | B_ID |
+----+------+
| 88 | 100 |
+----+------+
现在仍然无法更新 TableJ 记录 88 字段 B_ID 的值为 100。
我不确定我是否理解正确,但这是我的解决方案
Update TableJ J
Inner Join (
Select B_ID,TableC.C, TableBS.S
from TableC Inner Join TableBS
on TableC.B= TableBS.B
group by TableC.C,TableBS.S
having count(*)=1
) C
On J.C=C.C
Set J.B_ID=C.B_ID
到目前为止,这似乎已经成功了:
Update TableJ T1
Inner Join
(Select J.ID,B.B_ID
From TableJ J Inner Join TableBS B Inner Join TableC C
On J.C=C.C
And J.S = B.S
And B.B_ID=C.B_ID
group by J.ID having count(*)=1) T2
On T1.ID=T2.ID Set T1.B_ID=T2.B_ID
基本上首先用 select 解决了它,它返回了 Update TableJ 的 ID 和来自 TableBS 的 B_ID ,其中 TableC 中的 C 与 TableJ 中的 C 匹配,TableBS 中的 S 与表 J 中的 S。我根据 TableJ 中的 ID 对结果进行了统计,这样我只在得到一个结果时才返回值。
我可以根据第二个 table 中的计数在 table 之间进行更新,如下所示:
Update TableJ J
Inner Join (Select B_ID,C,S from TableC group by C,S having count=1) C
On J.C=C.C and J.S=C.S
Set T1.B_ID=T2.B_ID
问题是我的 TableC 不包含 S
,它存储在另一个 table 中并通过 B
关联,称之为 Table_BS
(请不要开玩笑:| ).如果我不必担心计数,那么我可以这样做:
Update TableJ J
Inner Join TableC C
Inner Join TableBS BS
On J.C=C.C and C.S=BS.S
Set J.B_ID=BS.B_ID
除了问题是,与原始计数一样,当只有一个 C
记录和 S
记录时,我只想 return B_ID
TableBS
.
更新: 好吧,这就是我取得的进展(select 明智):
Select J.ID,B.B_ID
From DBJ J Inner Join LBS B Inner Join C
On J.C=C.C And (
J.S_ID = B.S_ID
or J.S_ID=B.CS_ID)
and B.B_ID=C.B_ID
在我的例子中 returns 三个记录:
+----+------+
| ID | B_ID |
+----+------+
| 88 | 100 |
+----+------+
| 90 | 200 |
+----+------+
| 90 | 200 |
+----+------+
ID 是我要更新的记录,B_ID 是我要更新的值。在这种情况下,结果是我试图限制的计数是输出中的 ID 列,换句话说,我只想更新 TableJ,记录 88 的值为 100。TableJ 记录 90 原来有 >1 个结果,所以我想跳过它。只是不确定将 group by
或 count
放在哪里。
更新:虽然越来越接近,但不确定为什么这个解决方案仍然超出我的掌握范围,我可以获得 select 到现在 return 要更新的记录的 ID 和要更新的值仅在那些有一个结果的记录上:
Select J.ID,B.B_ID
From DBJ J Inner Join LBS B Inner Join C
On J.C=C.C And (
J.S_ID = B.S_ID
or J.S_ID=B.CS_ID)
and B.B_ID=C.B_ID group by J.ID having count(*)=1
哪个return
+----+------+
| ID | B_ID |
+----+------+
| 88 | 100 |
+----+------+
现在仍然无法更新 TableJ 记录 88 字段 B_ID 的值为 100。
我不确定我是否理解正确,但这是我的解决方案
Update TableJ J
Inner Join (
Select B_ID,TableC.C, TableBS.S
from TableC Inner Join TableBS
on TableC.B= TableBS.B
group by TableC.C,TableBS.S
having count(*)=1
) C
On J.C=C.C
Set J.B_ID=C.B_ID
到目前为止,这似乎已经成功了:
Update TableJ T1
Inner Join
(Select J.ID,B.B_ID
From TableJ J Inner Join TableBS B Inner Join TableC C
On J.C=C.C
And J.S = B.S
And B.B_ID=C.B_ID
group by J.ID having count(*)=1) T2
On T1.ID=T2.ID Set T1.B_ID=T2.B_ID
基本上首先用 select 解决了它,它返回了 Update TableJ 的 ID 和来自 TableBS 的 B_ID ,其中 TableC 中的 C 与 TableJ 中的 C 匹配,TableBS 中的 S 与表 J 中的 S。我根据 TableJ 中的 ID 对结果进行了统计,这样我只在得到一个结果时才返回值。