【问题标题】:Compare two columns of table a to a single column of table b将表 a 的两列与表 b 的单列进行比较
【发布时间】:2013-05-01 17:49:01
【问题描述】:

这是在 Oracle 11g 中 我有一个表:LOG,其中包含许多列,如下所示的 2 列:

ticketid
comments

我有另一个表 APP_ACCESS,其中包含(在其他列中)

user_id
appl_id
env_id
ticketid

APP_ACCESS 的 user_id、appl_id 和 env_id 是 LOG 表中 cmets 列的一部分。无论这些部分存在于何处(全部三个),我都需要从 LOG 表中获取 ticketid 并更新 APP_ACCESS。

我尝试的如下(我无法检索票证本身,没有返回任何内容):

select L.ticketid from LOG L join APP_ACCESS U
on INSTR(L.COMMENTS, U.USER_ID) > 0 and INSTR(L.COMMENTS, U.APPL_ID) > 0

编辑#1 cmets列中的样本数据(注意:这是一个单元格,即一列一行的数据):

ATTEMPTED: MANAGERCOMMENTS="TEST",AFTER: MANAGERCOMMENTS="TEST"
ATTEMPTED: JUSTIFICATION="TEST",AFTER: JUSTIFICATION="TEST"
ATTEMPTED: REQUESTORDIVISION="DOF",AFTER: REQUESTORDIVISION="DOF"
ATTEMPTED: USERSELECTED="VEXUSERTEST",AFTER: USERSELECTED="VEXUSERTEST"
ATTEMPTED: REQUESTTYPE="CHANGE ACCESS",AFTER: REQUESTTYPE="CHANGE ACCESS"
ATTEMPTED: REQUESTORREGION="WASHINGTON",AFTER: REQUESTORREGION="WASHINGTON"
ATTEMPTED: ENVIRONMENTSELECTED="DEVELOPMENT",AFTER: ENVIRONMENTSELECTED="DEVELOPMENT"
ATTEMPTED: REQUESTORCOMMENTS="TEST",AFTER: REQUESTORCOMMENTS="TEST"
ATTEMPTED: APPLICATIONSELECTED="TEST_APP",AFTER: APPLICATIONSELECTED="TEST_APP"
ATTEMPTED: REQUESTOR="PRTEST",AFTER: REQUESTOR="PRTEST"
ATTEMPTED: ADDEDACCESSLEVELS="DEFAULT ACCESS",AFTER: ADDEDACCESSLEVELS="DEFAULT ACCESS"

USERSELECTED=" 后面的字符串与APP_ACCESS 表中的USER_ID 相同。 APPLICATIONSELECTED="后的字符串与APP_ACCESS表中的APPL_ID相同。同样ENVIRONMENTSELECTED="后的字符串映射到APP_ACCESS表中的ENV_ID。

【问题讨论】:

  • 您能否发布一个示例Comments 值及其匹配的user_id、appl_id 和env_id 值? INSTR 可能不准确 - 例如,如果您正在寻找 user_id=10,它将在与 user_id=10、user_id=101、user_id=1000 等匹配时返回命中。了解comments 的值将决定是否可以解决此问题。
  • @EdGibbs 我同意。如果这些值以已知顺序分隔或分组,您将能够更轻松地扫描这些子字符串。
  • 我已经用 cmets 数据样本更新了问题

标签: sql oracle join oracle11g


【解决方案1】:

Anoop,对于迟到的回复,我深表歉意 - 直到几分钟前我才看到您更新的帖子。

我不能 100% 确定您完成的查询会是什么样子,但是对于 Log 和 App_Access 表之间的比较,逻辑将是这样的:

 INSTR(L.Comments, 'USERSELECTED="' || U.User_ID || '"') > 0 AND
 INSTR(L.Comments, 'APPLICATIONSELECTED="' || U.Appl_ID || '"') > 0 AND
 INSTR(L.Comments, 'ENVIRONMENTSELECTED="' || U.Env_ID || '"') > 0

根据您的需要,您可以在WHERE 子句中或作为JOIN 条件的一部分使用它。我希望这足以推动你前进。

【讨论】:

  • 我也喜欢这个。这确保我只选择与属性名称匹配的数据。我将其合并到我的查询中。
【解决方案2】:

您的查询失败可能是因为 APP_ACCESS 表中的值被空白字符包围,或者因为这些值不是完全大写。如果是这样,下面的查询必须解决问题:

select L.ticketid from LOG L join APP_ACCESS U
on INSTR(L.COMMENTS, UPPER(TRIM(U.USER_ID))) > 0 
and INSTR(L.COMMENTS, UPPER(TRIM(U.APPL_ID))) > 0

其他可能性:

  • 缺少一些中间字母;所以,这些值是相似的机器人不太匹配。

  • ticketid 列是null!

  • ...

【讨论】:

  • 谢谢!这很有帮助,UPPER 是关键。
猜你喜欢
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
相关资源
最近更新 更多