标题有点令人满意,但基本上我有两个表,一个包含事件数据,例如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'
我不再重复,但我也停止搜索我仍想做的决议字段。
我正在寻找的是每个事件的一行,包括事件的描述,同时在描述和解析字段中进行搜索。
答案 0 :(得分: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
的时间之一,因为即使描述不包含搜索文本,我们也需要行。