使用左外连接,防止交叉列出现两次

时间:2017-07-24 15:53:09

标签: sql json foreign-keys relational-database

我有两个关系表(我使用外键的原因是因为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来指定我想要的列名,但它返回语法错误。我只尝试了两个连续的选择查询。我也尝试了一个联盟,但它返回列数不匹配(我猜联盟是添加行而不是列)。我希望这个问题的答案能够让我在java方面臃肿,并可能在我的架构设计中指出任何可能出现的问题。如果这是糟糕的设计请指出,这是我第一次在数据库和Web应用程序之间传输JSON数据。

编辑:我正在使用H2数据库supports " IBM DB2,Apache Derby,HSQLDB,MS SQL Server,MySQL,Oracle和PostgreSQL的兼容模式"

2 个答案:

答案 0 :(得分:3)

许多数据库都支持ANSI标准USING子句。如果你的是其中之一,那么你可以简单地做:

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

否则,您必须明确列出您想要的列。

答案 1 :(得分:2)

您需要在连接上指定一次列名,如下所示:

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

这将带来Analytics(a)中的所有列,然后指定KV表中没有KVID的所有列