首页 > 解决方案 > 如何使用 sql server 或 pandas 函数创建更新列值的查询

问题描述

现在我有一个类似于下表的表格:

esn_missing_in_DF_umts

|---------------------|------------------|---------------------|------------------|------------------|------------------|
|      cell_name      |     n_cell_name  |    source_vendor    |    target_vendor |     source_rnc   |     target_rnc   |
|---------------------|------------------|---------------------|------------------|------------------|------------------|
|         1           |         8        |         x           |         y        |                  |                  |
|---------------------|------------------|---------------------|------------------|------------------|------------------|
|         2           |         5        |         x           |         x        |                  |                  |
|---------------------|------------------|---------------------|------------------|------------------|------------------|
|         3           |         6        |         x           |         x        |                  |                  |
|---------------------|------------------|---------------------|------------------|------------------|------------------|
|         4           |         9        |         x           |         y        |                  |                  |
|---------------------|------------------|---------------------|------------------|------------------|------------------|
|         5           |         10       |         x           |         y        |                  |                  |
|---------------------|------------------|---------------------|------------------|------------------|------------------|
|         6           |         11       |         x           |         y        |                  |                  |
|---------------------|------------------|---------------------|------------------|------------------|------------------|
|         7           |         12       |         x           |         y        |                  |                  |
|---------------------|------------------|---------------------|------------------|------------------|------------------|

现在我有两列是空的sqlServer或和:dataframesource_rnctarget_rnc

这是我要更新两列的另外两个表

esn_umts_intra_sho

|---------------------|------------------|------------------|
|      ucell          |    urelation     |     ucell_rnc    |
|---------------------|------------------|------------------|
|         13          |         5        |         abc567   |
|---------------------|------------------|------------------|
|         8           |         6        |         abc568   |
|---------------------|------------------|------------------|
|         14          |         8        |         abc569   |
|---------------------|------------------|------------------|
|         7           |         9        |         abc570   |
|---------------------|------------------|------------------|
|         16          |        10        |         abc571   |
|---------------------|------------------|------------------|
|         5           |        11        |         abc572   |
|---------------------|------------------|------------------|
|         17          |        12        |         abc573   |
|---------------------|------------------|------------------|
|         10          |         9        |         abc574   |
|---------------------|------------------|------------------|
|         9           |        17        |         abc575   |
|---------------------|------------------|------------------|
|         12          |        11        |         abc576   |
|---------------------|------------------|------------------|
|         11          |        12        |         abc577   |
|---------------------|------------------|------------------|

df_umts_carrier

|---------------------|------------------|
|      cell_name_umts |     rnc          |
|---------------------|------------------|
|         1           |         xyz123   |
|---------------------|------------------|
|         2           |         xyz124   |
|---------------------|------------------|
|         3           |         xyz125   |
|---------------------|------------------|
|         4           |         xyz126   |
|---------------------|------------------|
|         5           |         xyz127   |
|---------------------|------------------|
|         6           |         xyz128   |
|---------------------|------------------|
|         7           |         xyz129   |
|---------------------|------------------|

所以不是我想通过这两个表更新source_rncandtarget_rncesn_umts_intra_shodf_umts_carrier

所以我想查询可能是这样的

UPDATE [toolDB].[dbo].[esn_missing_in_DF_umts]
 SET [toolDB].[dbo].[esn_missing_in_DF_umts].[target_rnc] = CASE WHEN [toolDB].[dbo].[esn_missing_in_DF_umts].[target_vendor] = 'HUA' THEN [toolDB].[dbo].[df_umts_carrier].[rnc]
 FROM [toolDB].[dbo].[esn_missing_in_DF_umts]
  INNER JOIN [toolDB].[dbo].[df_umts_carrier] 
  ON [n_cell_name] = [cell_name_umts] 
ELSE
 UPDATE [toolDB].[dbo].[esn_missing_in_DF_umts] 
  SET [toolDB].[dbo].[esn_missing_in_DF_umts].[target_rnc] = [toolDB].[dbo].[esn_umts_intra_sho].[ucell_rnc]
  From [toolDB].[dbo].[esn_missing_in_DF_umts] INNER JOIN [toolDB].[dbo].[esn_umts_intra_sho] 
  ON [n_cell_name] = [ucell]

我希望最终输出是这样的:

|---------------------|------------------|---------------------|------------------|------------------|------------------|
|      cell_name      |     n_cell_name  |    source_vendor    |    target_vendor |     source_rnc   |     target_rnc   |
|---------------------|------------------|---------------------|------------------|------------------|------------------|
|         1           |         8        |         x           |         y        |        xyz123    |   abc568         |
|---------------------|------------------|---------------------|------------------|------------------|------------------|
|         2           |         5        |         x           |         x        |        xyz124    | xyz127           |
|---------------------|------------------|---------------------|------------------|------------------|------------------|
|         3           |         6        |         x           |         x        |        xyz125    |   xyz128         |
|---------------------|------------------|---------------------|------------------|------------------|------------------|
|         4           |         9        |         x           |         y        |        xyz126    |   abc575         |
|---------------------|------------------|---------------------|------------------|------------------|------------------|
|         5           |         10       |         x           |         y        |        xyz127    |  abc574          |
|---------------------|------------------|---------------------|------------------|------------------|------------------|
|         6           |         11       |         x           |         y        |        xyz128    |   abc576         |
|---------------------|------------------|---------------------|------------------|------------------|------------------|
|         7           |         12       |         x           |         y        |        xyz129    |  abc577          |
|---------------------|------------------|---------------------|------------------|------------------|------------------|

我什至尝试使用熊猫但没有用......我希望有人帮助我。

标签: pythonsql-serverpandas

解决方案


最好的办法是使查询就像您正在编写带有 Case 子句的 SELECT 语句一样。一旦它按预期工作,您可以对其进行修改以进行更新。

所以在这个例子中,如果主表 Column = bla,则从第一个连接表中获取数据,否则从另一个表中获取数据。

快速修改确保您愿意更新所有行,否则请记住放入 where 语句。这就是为什么最好在 SELECT 中制定你的逻辑并从那里继续前进的原因。

我想你想要这样的东西:

UPDATE  [toolDB].[dbo].[esn_missing_in_DF_umts] 
SET [toolDB].[dbo].[esn_missing_in_DF_umts].[target_rnc] = (CASE WHEN UMT.target_vendor = 'HUA' THEN carrier.rnc ELSE SHO.ucell_rnc END )
FROM [toolDB].[dbo].[esn_missing_in_DF_umts] UMT
LEFT JOIN [toolDB].[dbo].[df_umts_carrier] carrier ON  UMT.n_cell_name = carrier.cell_name_umts
LEFT JOIN [toolDB].[dbo].[esn_umts_intra_sho] SHO   ON UMT.n_cell_name = SHO.ucell

推荐阅读