1

标题有点拗口,但基本上我有两个表,其中一个包含事件数据,例如,incident_data包含事件 ID、日期、时间和其他结构化字段等内容。另一个incident_text包含描述、分辨率和其他自由格式的文本字段。

我想同时搜索描述和分辨率字段incident_text并将其加入incident_data以获取更多详细信息。它们由 连接incidentno,每个事件在 中可以有两个条目incident_text,一个用于描述,另一个用于解决。

说这是我的查询:

SELECT    
DISTINCT INCIDENTNO as "Incident Number",
SOME_OTHER_FIELDS ETC..,
TEXTFIELD AS "Text"
TEXTFIELDTYPE AS "Text Type"

FROM INCIDENT_DATA
INNER JOIN INCIDENT_TEXT
ON INCIDENT_DATA.INCIDENTNO=INCIDENT_TEXT.INCIDENTNO

WHERE TEXT LIKE ANY ('%THIS THING%', '%THAT THING%')

这给了我一张这样的桌子,尽管使用DISTINCT

INCIDENT-1 ... FORGOT MY PASSWORD TO THIS THING ... DESCRIPTION
INCIDENT-1 ... PASSWORD RESET TO THAT THING.... RESOLUTION

如果我添加AND TEXTFIELDTYPE = 'DESCRIPTION'我不再得到重复,但我也停止搜索分辨率字段,我仍然想这样做。

我正在寻找的是每个事件一行,带有事件的描述,同时在描述和解决方案字段中进行搜索。

4

1 回答 1

1

你非常接近 - 主要归结为告诉 SQL 分别处理描述和解析行。

SELECT Incident_Data.incidentNo as "Incident Number",
       some_other_fields etc..,
       d.textField AS "Text", d.textFieldType AS "Text Type"
FROM Incident_Data
INNER JOIN Incident_Text d
        ON d.incidentNo = Incident_Data.incidentNo
           AND d.textFieldType = 'Description'
LEFT JOIN Incident_Text r
       ON r.incidentNo = Incident_Data.incidentNo
          AND r.textFieldType = 'Resolution'
          AND r.textField LIKE ANY ('%THIS THING%', '%THAT THING%')
WHERE d.textField LIKE ANY ('%THIS THING%', '%THAT THING%')
      OR r.incidentNo IS NOT NULL

(未测试,请验证)
- 一个注释 - 您不使用UPPER()(或LOWER(),或类似);你确定那个外壳正在被使用吗?
这也是WHERE无法将子句条件上移到 中的情况之一INNER JOIN,因为即使描述不包含搜索文本,我们也需要这些行。

于 2013-03-18T16:12:08.720 回答