将表a的两列与表b的单列进行比较

时间:2013-05-01 17:49:02

标签: sql oracle join oracle11g

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

ticketid
comments

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

user_id
appl_id
env_id
ticketid

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

我尝试的是下面的内容(我没有检索到ticketid本身,没有返回任何内容):

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 注释列中的示例数据(注意:这是一个单元格,即一列,一行数据):

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。

2 个答案:

答案 0 :(得分:1)

Anoop,对于迟到的回复我很抱歉 - 几分钟前我没有看到你的更新帖子。

我不是100%确定完成的查询的外观,但是对于LogApp_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条件的一部分。我希望这足以让你前进。

答案 1 :(得分:0)

您的查询失败可能是因为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

  • ...