【问题标题】:How To Keep Records in Order from Derived Table如何保持派生表中的记录有序
【发布时间】:2021-08-25 20:19:12
【问题描述】:

我正在尝试从远程 DB2 表更新 SQL 表。同一条记录可能有多个更新,但我需要按照它们在 DB2 表中的顺序进行更新。您不能在派生表上使用 Order By。我尝试了几种不同的选项来尝试使其正常工作,但更新仍然没有按顺序进行。

例如:

  • 更改 1 - 客户名称 = ABCX
  • 更改 2 - 客户名称 = ABC

在我运行查询之后,客户名称应该是 ABC,而应该是 ABC。

我真的不知道还能尝试什么。我已经尝试过临时表(仍然是派生表),创建了一个包含日期和时间字段、子选择、row_number() over(按日期、时间排序)和许多其他内容的连接字段。我想按远程表中的日期和时间字段对其进行排序。

任何见解都将不胜感激。

谢谢。

这是我的基本代码:

        SET
            A.CUSRID = B.RECORD_ID,
            A.CUSSTS = B.ACTIVE_CODE,
            A.CUSCOM = B.COMPANY_NUMBER,
            A.CUSMNM = B.CUSTOMER_NAME,
            A.CUSAD1 = B.CUSTOMER_ADDRESS_1,
            A.CUSAD2 = B.CUSTOMER_ADDRESS_2,
            A.CUSAD3 = B.CUSTOMER_ADDRESS_3,
            A.CUSZIP = B.CUSTOMER_ZIP_CODE,
            A.CUSZPE = B.CUSZPE_NOT_USED,
            A.CUSSTC = B.CUSTOMER_STATE,
            A.CUSARA = B.CUSTOMER_AREA_CODE,
            A.CUSPHN = B.CUSTOMER_PHONE,
            A.CUSB17 = B.CUSB17_NOT_USED,
            A.CUSTMT = B.STATEMENT_PRINT_CODE,
            A.CUSCRL = B.CREDIT_LIMIT,
            A.CUSCRC = B.CREDIT_CODE,
            A.CUSMCD = B.CUSMCD_NOT_USED,
            A.CUSTX1 = B.TAX_RATE_1,
            A.CUSTX2 = B.TAX_RATE_2,
            A.CUSTXC = B.TAX_RATE,
            A.CUSTXE = B.TAX_EXEMPT_ID,
            A.CUSB48 = B.CUSB48_NOT_USED,
            A.CUSMDT = B.MAINTENANCE_DATE,
            A.CUSB20 = B.CUSB20_NOT_USED,
            A.CSSRCH = B.SEARCH_FIELD,
            A.CUSBRN = B.BRANCH_ID,
            A.CUSDST = B.DISTRIBUTOR_NUMBER,
            A.CUSB28 = B.CUSB28_NOT_USED
    FROM 
        dbo.mcusmas A 
        INNER JOIN (
            SELECT
                RECORD_ID,
                ACTIVE_CODE,
                COMPANY_NUMBER,
                CUSTOMER_NUMBER,
                CUSTOMER_NAME,
                CUSTOMER_ADDRESS_1,
                CUSTOMER_ADDRESS_2,
                CUSTOMER_ADDRESS_3,
                CUSTOMER_ZIP_CODE,
                CUSZPE_NOT_USED,
                CUSTOMER_STATE,
                CUSTOMER_AREA_CODE,
                CUSTOMER_PHONE,
                CUSB17_NOT_USED,
                STATEMENT_PRINT_CODE,
                CREDIT_LIMIT,
                CREDIT_CODE,
                CUSMCD_NOT_USED,
                TAX_RATE_1,
                TAX_RATE_2,
                TAX_RATE,
                TAX_EXEMPT_ID,
                CUSB48_NOT_USED,
                MAINTENANCE_DATE,
                CUSB20_NOT_USED,
                SEARCH_FIELD,
                BRANCH_ID,
                DISTRIBUTOR_NUMBER,
                CUSB28_NOT_USED,
            FROM remoteserver.MCUSMASPLG
            WHERE Event_State_ID = '*New' AND SENT_TO_DATA_WAREHOUSE = 'N'
        ) B
        ON A.CUSMNB = B.CUSTOMER_NUMBER

【问题讨论】:

  • 你从错误的方向接近它;您应该只更新每行一次并从源获取最新值,例如具有最大日期、最大 Id 等的行
  • 那么当同一行有多个更新时,我需要多次运行查询以获取所有更新?
  • 我认为您并不完全理解支持 RDBMS 模型的概念。我认为您正在尝试做的是一个相当常见的场景,如果您将表格和示例数据的详细信息以及预期结果添加到您的问题中,那么有人会更容易正确地提出建议。

标签: sql sql-server tsql


【解决方案1】:

没有“更改 1”或“更改 2”。只有行,SQL Server 任意使用其中之一。如果你想控制行,你应该提前选择你想要的:

FROM dbo.mcusmas A JOIN
     (SELECT B.*,
             ROW_NUMBER() OVER (PARTITION BY CUSTOMER_NUMBER ORDER BY <ordering col>) as seqnum
      FROM remoteserver.MCUSMASPLG
      WHERE Event_State_ID = '*New' AND
            SENT_TO_DATA_WAREHOUSE = 'N'
     ) B
     ON A.CUSMNB = B.CUSTOMER_NUMBER

我不知道您如何确定哪一行是正确的。想必有些专栏有这个信息,你可以在ORDER BY中使用。

【讨论】:

  • 谢谢,但我想我简化了示例...当我说更改 1 时,它首先在远程文件中,它可能还有其他列有更改,因此需要更新先应用。更改 2 可能仅更改同一记录中的一列,因此我需要两条记录中发生的更改,而不仅仅是最后一条。希望这是有道理的?
  • @Elonna 。 . .这不是update 的工作方式。它根据 一个 匹配行进行更新。任何匹配的行。
  • 是的,我开始明白了。谢谢你。我认为这需要在程序中完成。我的经理告诉我使用查询,但不要认为他意识到可能会有多个更改。感谢您的回复。
猜你喜欢
  • 2011-05-06
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多