2013-03-18 54 views
1

标题有点儿含糊不清,但本质上我有两张表,一张带有事件数据,例如incident_data,其中包含事件ID,日期,时间和其他结构化字段。另一个incident_text包含描述,分辨率和其他自由格式的文本字段。当连接每个记录有两个条目的表时,如何返回Teradata SQL中的不同记录?

我想同时搜索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

...'DISTINCT'正常工作 - 它为您提供两行,每行都有不同的'TEXTFIELD'值(这是针对整个结果集而不是每列)。您的模式设计有点可疑 - 解决方案应该放在他们自己的表格中。除此之外,你想看到什么样的结果 - 你是否也想要显示分辨率?至少,无论如何,您都需要两次加入“Incident_Text”。 – 2013-03-18 15:41:03

+0

我希望通过描述查看每个事件,同时搜索描述和分辨率字段,每个唯一事件编号一行。我绝对同意架构问题... – pedram 2013-03-18 15:44:01

回答

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中的时间之一,因为即使描述不包含搜索文本,我们也需要这些行。

+0

我收到一个错误'INNER JOIN Incident_Text as Description':在连接表的搜索条件中不正确的列引用。 – pedram 2013-03-18 16:55:16

+0

@multiphrenic - 对不起,我忘了并不是所有的RDBMS都允许'as'来指定表别名 - 除了错字。另外,我没有资格列出所有列是从哪里来的,这也是一个问题。现在怎么样? – 2013-03-18 19:52:41

+0

'DESCRIPTION'是Teradata **保留字**(用于TPT),因此不应使用。我建议将这些别名改为更容易阅读的内容(如** D **和** R **)。 – BellevueBob 2013-03-19 17:58:44

相关问题