2017-07-24 48 views
0

我有兩個關係表(我使用外鍵的理由是因爲KV是嵌套在我的JSON數據反對):使用左外連接,防止路口柱出現兩次

CREATE TABLE analytics(
e VARCHAR(50), 
t VARCHAR(50), 
kv_id INT AUTO_INCREMENT 
); 
CREATE TABLE kv(
kv_id INT AUTO_INCREMENT, 
url VARCHAR(100), 
name VARCHAR(100), 
referrer VARCHAR(100), 
id VARCHAR(100), 
sessionID VARCHAR(100), 
quote BIGINT(20), 
category VARCHAR(50), 
hitCallback VARCHAR(50), 
eventType VARCHAR(50) 
) 

我目前正在使用:

SELECT * FROM 
Analytics 
LEFT OUTER JOIN 
Kv 
ON 
Analytics.kv_Id = KV.kv_id 

顯示此: H2 table

我試圖讓kv_id列只出現一次,但最好不要更改架構。如果它出現兩次,我將不得不使用JDBC在我的ResultSet對象中解析它。如果我可以擺脫它的查詢會簡單得多。我試着用期望的列替換asterik來指定我想要的列名,但它返回語法錯誤。我已經嘗試了兩個連續的選擇查詢。我也嘗試過一個聯合,但它返回列計數不匹配(我想union是添加行而不是列)。我希望這個問題的答案能夠讓我在Java方面臃腫,並且可能會指出我的模式設計中可能出現的任何問題。如果這是不好的設計,請指出,這是我第一次在數據庫和Web應用程序之間傳輸JSON數據。

編輯:我使用的supports「爲IBM DB2,Apache Derby的,HSQLDB,MS SQL服務器,MySQL和Oracle和PostgreSQL的兼容模式」

+0

只需在'SELECT'中列出所需的列,而不是使用'SELECT *' – Lamak

+0

謝謝!這更詳細地通過@ Isaiah3015來解釋 –

+0

這非常基本,您需要閱讀已發佈的SQL介紹。 (許多教科書免費在線。) – philipxy

回答

2

您需要指定列的H2數據庫在你加入像這樣的名字一次:

SELECT a.*, k.column1, k.column2 FROM Analytics a 
LEFT OUTER JOIN Kv k ON a.kv_Id = K.kv_id 

這將使所有列從分析(一),然後指定從KV表中的所有列,而不克維德

3

許多數據庫s支持ANSI標準USING條款。如果你的是其中之一,那麼你可以簡單地做:

SELECT * 
FROM Analytics a LEFT OUTER JOIN 
    Kv 
    USING (kv_id); 

否則,你將不得不列出你想明確列出。

+0

這對我來說是新的。所以,當你使用'USING'時,當你做'SELECT *'時,結果列在結果中只出現一次? – Lamak

+0

@Lamak是的。由於它是一個常見詞彙,因此很難在sql'using'上搜索匹配,但在質量文檔中閱讀select/join語法 - 例如MySQL,Oracle,Postgres。在這個標準下,你甚至不能點擊「使用」列。 – philipxy