【问题标题】:sas sql update returns nothingsas sql update 什么都不返回
【发布时间】:2017-09-19 14:04:36
【问题描述】:

我有 2 个表 - 父级和子级,每个有 2 列 - id 和地址,地址看起来像这样 -

\partNumber\a$\sometext....\ - 为孩子

和 \partNumber\a$\ - 用于父级。

我需要用 2 列制作一个表格 - 对于每个子 ID,我需要获取其父文件夹。 我试图通过使用 sql 来做到这一点

update work.Test
set parent_id = ( select pn.DirId 
from work.Parent pn
join work.Child cn on cn.dirPath like pn.dirPath & '%'); 

刚刚尝试了像这样的另一种选择

update work.Test
set parent_id = ( select pn.DirId 
                  from work.Parent pn
                  join work.Child cn on 
                  cn.dirPath = substr(pn.dirPath, 1, index( '%', pn.dirPath) +1)); 

但还是一样的结果

即使它给了我 0 错误,并在日志中显示它确实更新了所有 记录,作为最终结果,我的桌子上什么也没有。

【问题讨论】:

  • 为什么要使用 UPDATE 来制作表?那不应该是 CREATE TABLE 吗?
  • 抱歉,我之前制作了这个表,加载了子 ID,现在我正在尝试添加这个父 ID
  • 样本数据(以数据步骤的形式)会有很大帮助。

标签: sql sas proc-sql


【解决方案1】:

您可能只使用EQT 比较来查找具有相似前缀的地址。

data child ;
  input child_id address $50. ;
cards;
1 \partNumber\a$\sometext....\
2 no_parent
;
data parent ;
  input parent_id address $50.;
cards;
501 \partNumber\a$\
;

proc sql ;
  create table want as 
    select a.child_id,b.parent_id,a.address,b.address as parent_address
    from child a 
    left join parent b
    on a.address eqt b.address
  ;
quit;

结果:

                   parent_
Obs    child_id       id      address                         parent_address

 1         1         501      \partNumber\a$\sometext....\    \partNumber\a$\
 2         2           .      no_parent

【讨论】:

  • 这太棒了。有用。并感谢您向我展示了这个 eqt 函数
  • EQT 是运营商,仅供参考。
【解决方案2】:

我不确定我是否可以不知道 Test 表的来源。

无论如何,cn.dirPath like pn.dirPath & '%' 很可能没有做你想做的事。试试cn.dirPath like trim(pn.dirPath) || '%'

编辑:我添加了 trim(),pn.dirPath 可能有尾随空格。

【讨论】:

  • 按照之前创建的方式进行测试,然后在开始使用父 ID 更新它之前将所有子 ID 加载到其中。再一次,即使它没有错误并显示所有行都已更新测试表上仍然没有更新它的自我
  • 创建表比创建+更新快。此外,在原始查询中,嵌套选择不依赖于测试表中的数据,并且可能返回多个值。 Tom 使用“eqt”的解决方案比“like”IMO 更好。
猜你喜欢
  • 2020-06-08
  • 1970-01-01
  • 2012-06-18
  • 2018-09-10
  • 2017-02-14
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多