使用多个其他 table 的值更新一个 table
Updating one table using values from multiple other tables
我在更新和加入方面做得更好了,但这个问题似乎难倒了我。我希望我已经在下面解释清楚了,请原谅 field/table 符号,但我尽量保留它们,以便一旦我得到答案,我就可以轻松地应用于我的实际情况。我很乐意提供任何需要的澄清,我尽量保持解释性和简单性,希望我成功了。
我正在尝试更新 Table_J B_ID 字段,以便在该记录中查找 C
和 X_ID
值:
Table_J:
+----+-------+------+------+
| ID | C | X_ID | B_ID |
+----+-------+------+------+
| 1 | Alpha | 10 | |
+----+-------+------+------+
| 2 | Alpha | 20 | |
+----+-------+------+------+
| 3 | Alpha | 30 | |
+----+-------+------+------+
| 4 | Beta | 50 | |
+----+-------+------+------+
在其他表格中。
首先,对于每条记录,我需要找到 Table_C 中与 Table_J 中的 C
匹配的记录的所有 B_ID 值:
Table_C:
+-------+------+
| C | B_ID |
+-------+------+
| Alpha | 100 |
+-------+------+
| Alpha | 200 |
+-------+------+
| Alpha | 300 |
+-------+------+
| Beta | 400 |
+-------+------+
| Beta | 500 |
+-------+------+
对于 Table_J 中的记录 1,其中 C
= Alpha
在这种情况下,我将有 B_ID
个值 100
,200
和 300
来自 Table_C
然后我需要在 Table_X 中找到记录,其中 B_ID
等于任何找到的值以及 Table_J 中记录 1 的 X_ID
10
并使用 Table_X
中找到的 B_ID
更新 Table_J 中的 B_ID
,在本例中为 100
.
Table_X:
+------+------+
| B_ID | X_ID |
+------+------+
| 100 | 10 |
+------+------+
| 200 | 20 |
+------+------+
| 300 | 30 |
+------+------+
| 400 | 40 |
+------+------+
| 500 | 50 |
+------+------+
| 600 | 10 |
+------+------+
| 700 | 20 |
+------+------+
| 800 | 30 |
+------+------+
| 900 | 10 |
+------+------+
最终更新后 Table_J
会像这样更新:
Table J 更新:
+----+-------+------+------+
| ID | C | X_ID | B_ID |
+----+-------+------+------+
| 1 | Alpha | 10 | 100 |
+----+-------+------+------+
| 2 | Alpha | 20 | 200 |
+----+-------+------+------+
| 3 | Alpha | 30 | 300 |
+----+-------+------+------+
| 4 | Beta | 50 | 50 |
+----+-------+------+------+
Update J as T1
Inner Join C T2 Inner Join X T3
On T3.X_ID=T1.X_ID
and T3.B_ID=T2.B_ID
and T1.C=T2.C
Set T1.B_ID=T3.B_ID
原来比我想象的要简单;
- 首先我自然需要加入所有三个 table。
Set
是我最终要寻找的,在这种情况下,使用 Table_X
中的正确 B_ID
更新 Table_J
- 它的核心是
On
:
- 来自
Table_J
的 X_ID
(更新 table)必须匹配来自 Table_X
的 X_ID
- 而来自
Table_C
的 B_ID
必须匹配来自 Table_X
的 B_ID
(中介 table)
- 并且连接这两个条件
Table_J
中的 C
必须匹配 Table_C
中的 C
。
问题当然是 Table_X 中可以有多个 B_IDs 与 X_IDs 关联,并且 [=64] 中可以有多个 B_IDs 与 C 关联=] C. 鉴于在 Table_J 我知道 C 和 X_ID 第一个连接允许我收集所有与 C 关联的 B_IDs 然后最后一个连接允许我找到哪个B_IDs 与 Table_J 记录中的 X_ID 相同。
编辑:我意识到这可能会造成混淆,我在这里制作了 Sql Fiddle 来演示:http://sqlfiddle.com/#!9/dd23c3/2。我只能这样做 Select 但概念是一样的。
我在更新和加入方面做得更好了,但这个问题似乎难倒了我。我希望我已经在下面解释清楚了,请原谅 field/table 符号,但我尽量保留它们,以便一旦我得到答案,我就可以轻松地应用于我的实际情况。我很乐意提供任何需要的澄清,我尽量保持解释性和简单性,希望我成功了。
我正在尝试更新 Table_J B_ID 字段,以便在该记录中查找 C
和 X_ID
值:
Table_J:
+----+-------+------+------+
| ID | C | X_ID | B_ID |
+----+-------+------+------+
| 1 | Alpha | 10 | |
+----+-------+------+------+
| 2 | Alpha | 20 | |
+----+-------+------+------+
| 3 | Alpha | 30 | |
+----+-------+------+------+
| 4 | Beta | 50 | |
+----+-------+------+------+
在其他表格中。
首先,对于每条记录,我需要找到 Table_C 中与 Table_J 中的 C
匹配的记录的所有 B_ID 值:
Table_C:
+-------+------+
| C | B_ID |
+-------+------+
| Alpha | 100 |
+-------+------+
| Alpha | 200 |
+-------+------+
| Alpha | 300 |
+-------+------+
| Beta | 400 |
+-------+------+
| Beta | 500 |
+-------+------+
对于 Table_J 中的记录 1,其中 C
= Alpha
在这种情况下,我将有 B_ID
个值 100
,200
和 300
来自 Table_C
然后我需要在 Table_X 中找到记录,其中 B_ID
等于任何找到的值以及 Table_J 中记录 1 的 X_ID
10
并使用 Table_X
中找到的 B_ID
更新 Table_J 中的 B_ID
,在本例中为 100
.
Table_X:
+------+------+
| B_ID | X_ID |
+------+------+
| 100 | 10 |
+------+------+
| 200 | 20 |
+------+------+
| 300 | 30 |
+------+------+
| 400 | 40 |
+------+------+
| 500 | 50 |
+------+------+
| 600 | 10 |
+------+------+
| 700 | 20 |
+------+------+
| 800 | 30 |
+------+------+
| 900 | 10 |
+------+------+
最终更新后 Table_J
会像这样更新:
Table J 更新:
+----+-------+------+------+
| ID | C | X_ID | B_ID |
+----+-------+------+------+
| 1 | Alpha | 10 | 100 |
+----+-------+------+------+
| 2 | Alpha | 20 | 200 |
+----+-------+------+------+
| 3 | Alpha | 30 | 300 |
+----+-------+------+------+
| 4 | Beta | 50 | 50 |
+----+-------+------+------+
Update J as T1
Inner Join C T2 Inner Join X T3
On T3.X_ID=T1.X_ID
and T3.B_ID=T2.B_ID
and T1.C=T2.C
Set T1.B_ID=T3.B_ID
原来比我想象的要简单;
- 首先我自然需要加入所有三个 table。
Set
是我最终要寻找的,在这种情况下,使用Table_X
中的正确 - 它的核心是
On
: - 来自
Table_J
的X_ID
(更新 table)必须匹配来自Table_X
的 - 而来自
Table_C
的B_ID
必须匹配来自Table_X
的B_ID
(中介 table) - 并且连接这两个条件
Table_J
中的C
必须匹配Table_C
中的C
。
B_ID
更新 Table_J
X_ID
问题当然是 Table_X 中可以有多个 B_IDs 与 X_IDs 关联,并且 [=64] 中可以有多个 B_IDs 与 C 关联=] C. 鉴于在 Table_J 我知道 C 和 X_ID 第一个连接允许我收集所有与 C 关联的 B_IDs 然后最后一个连接允许我找到哪个B_IDs 与 Table_J 记录中的 X_ID 相同。
编辑:我意识到这可能会造成混淆,我在这里制作了 Sql Fiddle 来演示:http://sqlfiddle.com/#!9/dd23c3/2。我只能这样做 Select 但概念是一样的。