在Oracle数据库中从联接查询结果为每一行更新一列的最有效方法是什么?

佐拜尔·哈桑(Zobayer Hasan)

首先让我描述一下这种情况:

假设我有两个表“ PRODUCTS”和“ CUSTOMERS”,其描述如下:

产品表:

+----------+
| PRODUCTS |
+----------+
| ID       |
| CARD_ID  |
+----------+

和CUSTOMERS表:

+-----------+
| CUSTOMERS |
+-----------+
| ID        |
| APP_ID    |
| CARD_ID   |
+-----------+

所有这些字段都是数字类型。

这两个表相当大,已经包含了大量数据。在CUSTOMERS表中,CARD_ID与PRODUCTS表中的CARD_ID是相同的。这些表之间存在一对一的关系,即,一个客户只能使用一个CARD_ID,而一个以上客户不能使用任何CARD_ID。但是某些客户可能还没有使用过任何产品,即,其CARD_ID为空。

我想在我们的PRODUCTS表中为CUSTOMERS表添加一个反向引用(出于应用目的)。所以我做了类似的事情:

ALTER TABLE PRODUCTS ADD CUSTOMER_ID NUMBER DEFAULT -1 NOT NULL;

现在,由于已经存在数据,因此我还需要编写一个迁移查询。也就是说,如果客户使用的是ID为C的卡,那么我需要在C的客户ID字段中为所有此类现有匹配项添加该客户ID。

我曾经想过用类似的这个,但我的理解是,内选择查询这里是一个内部联接,所以我不知道是否会在这种情况下是有效的。

我也虽然使用了“ with”子句,但我认为“ with”仅适用于选择查询。[UPDATE]使用“ with”子句找到了,但这是一个好方法吗?

帮我弄清楚应该如何有效地做到这一点。例如,我现在不希望任何客户都没有使用的PRODUCTS中的行进行更新。

数据库:Oracle 12c。

提前致谢。

[编辑]只是想提一下,我最终为此使用了PL / SQL。在PL / SQL中,这非常容易。此外,对于我们来说,更容易通过飞行路线迁移系统进行处理。

DECLARE

CURSOR C IS SELECT customer.APP_ID, customer.CARD_ID FROM CUSTOMERS customer INNER JOIN PRODUCTS prod on customer.CARD_ID = prod.CARD_ID;

BEGIN

FOR rec IN C
LOOP
    UPDATE PRODUCTS p SET p.CUSTOMER_ID = rec.APP_ID WHERE p.CUSTOMER_ID is null and p.CARD_ID = rec.CARD_ID;

END LOOP;

END;

这是完成工作的另一种方式。这适合于我的特定应用程序。这是最好的方法吗?可能是,可能不是!

亭子

我同意您应避免更新产品表。我什至不会在其中添加customer_id列:它不仅会导致对customers.card_id列的更新花费更多时间-因为它还需要同时更新产品表-甚至可能导致不一致如果实施不防水。

相反,我建议创建一个将customer_id产品连接在一起的数据库视图

create view vw_products as
select      products.id, products.card_id, customers.customer_id
from        products
inner join  customers
        on  customers.card_id = products.card_id;

这样,您实际上并不需要存储customer_id,而是可以select从此视图而不是原始的product表中获取所需的内容。此外,无需对表数据进行任何迁移。

即使有大量数据,如果您在两个表card_id列上都定义了索引,这也将很好地执行

如果由于某些原因您确实需要将customer_id添加产品表中,则按如下所示更新该新列:

UPDATE products
SET    customer_id = (
    SELECT customer_id
    FROM   customers
    WHERE  customers.card_id = products.card_id);

注意:此数据库设计看起来违反直觉:客户与产品之间的一对一关系是该企业破产的保证。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

检查每一行到特定字符的最有效方法是什么

来自分类Dev

检查每一行到特定字符的最有效方法是什么

来自分类Dev

在不打开整数的情况下读取每一行的最有效方法是什么?

来自分类Dev

在关系数据库中记录同胞的最有效方法是什么?

来自分类Dev

从数据库中删除满足条件的实体的最有效方法是什么?

来自分类Dev

在Node JS中仅读取文件第一行的最有效方法是什么?

来自分类Dev

将大熊猫数据框的每一列与同一数据框的其他每一列相乘的最有效方法

来自分类Dev

使用Java,用数组中的值更新每一行中的一列的最佳方法是什么?(SQLite)

来自分类Dev

多次查询数据库的最有效方法

来自分类Dev

从 Azure 文档数据库的分区集合中的特定分区查询所有文档的最有效方法是什么?

来自分类Dev

在MySQL数据库中保存数据的最有效方法是什么

来自分类Dev

检查数据库中是否有新条目的最快,最有效的方法是什么?

来自分类Dev

如何有效地在Pyspark的数据帧的每一列上为每个最小值或最大值获取一行?

来自分类Dev

从pouchdb数据库读取关系的最有效方法是什么

来自分类Dev

检查用户是否存在于数据库中的最有效方法是什么?

来自分类Dev

计算一天中每一分钟“活动”数据框中有多少行的最有效方法是什么?

来自分类Dev

在另一个数据框中为每一行重复熊猫行的更有效方法?

来自分类Dev

将元组一分为二的最有效方法是什么?

来自分类Dev

使用 Wagtail 页面模型获取查询集中外键的特定字段的最有效的数据库方法是什么

来自分类Dev

对 Dataframe 中的一组选定行执行数学运算的最有效方法是什么

来自分类Dev

在R中删除数据表中空列的最有效方法是什么

来自分类Dev

MySQL:从RBAC数据库检索所有权限的最有效方法是什么?

来自分类Dev

更新每一行中的一列

来自分类Dev

Spark在PairRDD中获取唯一对的最有效方法是什么?

来自分类Dev

如何有效地更新许多百万行表中每一行的INT列

来自分类Dev

使用游标循环、插入和提交每一行的更有效方法(Oracle)

来自分类Dev

检查 Firebase 实时数据库节点值的相等性并更改它的最有效方法是什么?

来自分类Dev

为熊猫数据框的每一行替换一列中的字符串

来自分类Dev

划分数据表每一行的有效方法

Related 相关文章

  1. 1

    检查每一行到特定字符的最有效方法是什么

  2. 2

    检查每一行到特定字符的最有效方法是什么

  3. 3

    在不打开整数的情况下读取每一行的最有效方法是什么?

  4. 4

    在关系数据库中记录同胞的最有效方法是什么?

  5. 5

    从数据库中删除满足条件的实体的最有效方法是什么?

  6. 6

    在Node JS中仅读取文件第一行的最有效方法是什么?

  7. 7

    将大熊猫数据框的每一列与同一数据框的其他每一列相乘的最有效方法

  8. 8

    使用Java,用数组中的值更新每一行中的一列的最佳方法是什么?(SQLite)

  9. 9

    多次查询数据库的最有效方法

  10. 10

    从 Azure 文档数据库的分区集合中的特定分区查询所有文档的最有效方法是什么?

  11. 11

    在MySQL数据库中保存数据的最有效方法是什么

  12. 12

    检查数据库中是否有新条目的最快,最有效的方法是什么?

  13. 13

    如何有效地在Pyspark的数据帧的每一列上为每个最小值或最大值获取一行?

  14. 14

    从pouchdb数据库读取关系的最有效方法是什么

  15. 15

    检查用户是否存在于数据库中的最有效方法是什么?

  16. 16

    计算一天中每一分钟“活动”数据框中有多少行的最有效方法是什么?

  17. 17

    在另一个数据框中为每一行重复熊猫行的更有效方法?

  18. 18

    将元组一分为二的最有效方法是什么?

  19. 19

    使用 Wagtail 页面模型获取查询集中外键的特定字段的最有效的数据库方法是什么

  20. 20

    对 Dataframe 中的一组选定行执行数学运算的最有效方法是什么

  21. 21

    在R中删除数据表中空列的最有效方法是什么

  22. 22

    MySQL:从RBAC数据库检索所有权限的最有效方法是什么?

  23. 23

    更新每一行中的一列

  24. 24

    Spark在PairRDD中获取唯一对的最有效方法是什么?

  25. 25

    如何有效地更新许多百万行表中每一行的INT列

  26. 26

    使用游标循环、插入和提交每一行的更有效方法(Oracle)

  27. 27

    检查 Firebase 实时数据库节点值的相等性并更改它的最有效方法是什么?

  28. 28

    为熊猫数据框的每一行替换一列中的字符串

  29. 29

    划分数据表每一行的有效方法

热门标签

归档