2013-03-18 89 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

相關問題