SQL逻辑:使用3个表实现案例更新

时间:2019-01-03 20:16:24

标签: sql sql-server ssis

我正在寻找要使用3个表进行更新的SQL。

例如: 表1:

ID   Address  Name       MutipleID
1    ABC      Apple       123xyz
2    DEF      Mango       456stu
3    HFG      Orange      789wac

表2:

ID     ADDRESS   NAME      MutipleID
1      ABC       null      123xyz
2      null      Mango     456stu
null   HGF       null      789wac

表3:

ID      ADDRESS    NAME     MutlipleID
T                           123xyz
null      T                 456stu
null     null       T       789wac

所以,我的逻辑应该是这样,

  • “情况1:Table1.ID = Table2.id->更新表3.ID = T其他”
  • '情况2:Table1.Address = table2.address->更新table3。地址='T' 其他”
  • '案例3:Table1.Name = table2.name->更新Table3.Name ='T'

我的table3主要是一个查询表,用于检查表1和2中的哪些列匹配。

所有这三个表都有一个公共列“ MutilpleID”,这是它们用于创建udpates的链接列

我不确定如何实现此逻辑。

2 个答案:

答案 0 :(得分:0)

我以这种方式看到它:

update Table3
set
    ID      = case when t1.ID=t2.ID then 'T' else null end,
    ADDRESS = case when t1.ID<>t2.ID and t1.Address=t2.ADDRESS then 'T' else null end,
    NAME    = case when t1.ID<>t2.ID and t1.Address<>t2.ADDRESS
                    and t1.Name=t2.NAME then 'T' else null end
from Table3 t3
join Table2 t2 on (t3.MultipleID=t2.MultipleID)
join Table1 t1 on (t2.MultipleID=t1.MultipleID)

答案 1 :(得分:0)

这可以在数据流任务中通过使用查找组件来匹配表1和表2来完成。从这一点出发,然后可以根据ID,Address和Name列中的值重定向行,并更新表3相应地。当然,需要对您的确切表名和列名进行一些更新,但是下面列出了此过程的概述。

  • 使用OLE DB源创建数据流任务,该源从表1中选择必要的列。
  • 接下来添加一个Lookup组件,并将OLE DB源连接到它。由于MutipleID列中包含文本,因此建议您使用No cache选项,以避免潜在的排序规则/大小写比较问题,除非您要按大小写进行匹配。默认情况下,查找将使没有相应匹配项的行失败,因此您将希望使用Redirect Rows to no Match OutputIgnore Failure选项来处理没有匹配项的行(在“常规”窗格中查找编辑器)。
  • 在“查找”的“连接”窗格上,使用“ SQL查询”选项并输入一个查询,该查询仅返回表二中所需的列。除非需要表包含的所有列,否则不要使用table / view选项,否则会添加不必要的列。
  • 在“列”页面上,链接来自两个来源的MutipleID列。接下来,通过选中每列旁边的框并在“查找操作”字段中选择<add as new column>选项,将表2中的列添加到数据流中。在“输出别名”字段中给他们一个描述性名称,例如LKUP_ID。
  • 接下来,在数据流任务中添加条件拆分,并将其连接到Lookup Match Output输出。对于第一个条件,为两个表的ID列添加一个比较。请注意,如果这些为空,则这将导致错误。为避免这种情况,请在REPLACENULL函数中包装每一列。如果您不想匹配空值,请为每列的第二个参数使用不同的值。这篇文章的末尾有一个示例(该示例与null不匹配)。条件拆分会将行仅定向到一个输出,这是条件为true的第一个输出。按照问题的顺序,在ID列中添加一个条件,然后依次在Address和Name列中添加一个条件。给每个输出一个符合条件的名称,即ID匹配的匹配ID输出。
  • 添加三个OLE DB命令,并将每个连接到您创建的输出之一。在OLE DB命令编辑器中,选择相同的连接管理器。在“组件属性”页面上,输入更新命令,该命令将根据条件拆分中进行的匹配来更新表3中的相应列。下面是一个示例。本示例使用第一个条件,即匹配的ID。问号是参数占位符。该参数将被映射到“列映射”页面上。在此页面上,将“ MutlipleID”列从“可用输入列”框中拖动/链接到“可用目标列”框中的参数(可能标记为Param_0)。这将使用数据流中的MutlipleID列来匹配表3中的相应行。更新连接到匹配地址输出的另一个OLE DB命令以对Address列进行相同的更新,并重复相同的步骤名称输出和列也是如此。
  • OLE DB命令确实按行进行操作,因此,如果您要处理大量数据,建议您将它们替换为登台表,并通过一个基于集合的更新来进行更新联接到表3。例如,用登台表替换OLE DB命令作为OLE DB目标,并在数据流任务之后通过Execute SQL任务中的T-SQL联接进行基于集合的更新。

有条件拆分示例条件:

REPLACENULL(ID, 0) == REPLACENULL(LKUP_ID, 1)

OLE DB命令更新SQL:

UPDATE YourSchema.Table3 SET ID = 'T' WHERE MultipleID = ?