【问题标题】:Using Left Outer Join, prevent intersection column from appearing twice使用左外连接,防止交叉列出现两次
【发布时间】:2017-07-24 15:53:08
【问题描述】:

我有两个关系表(我使用外键的原因是因为 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

显示这个:

我试图让 kv_id 列只出现一次,但最好不要更改架构。如果它出现两次,我将不得不使用 JDBC 在我的 ResultSet 对象中解析它。如果我可以在查询中摆脱它会简单得多。我尝试通过用所需的列替换星号来指定我想要的列名,但它返回语法错误。我只尝试了两个连续的选择查询。我也尝试过联合,但它返回列数不匹配(我猜联合是添加行而不是列)。我希望这个问题的答案能让我在 java 方面避免臃肿,并可能指出我的模式设计中可能存在的任何问题。如果这是不好的设计,请指出,这是我第一次在数据库和 Web 应用程序之间传输 JSON 数据。

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

【问题讨论】:

  • 只需在SELECT 中列出您需要的列,而不是使用SELECT *
  • 谢谢! @Isaiah3015 更明确地解释了这一点
  • 这太基础了,您需要阅读已发布的 SQL 简介。 (许多教科书都是在线免费的。)

标签: sql json foreign-keys relational-database


【解决方案1】:

许多数据库支持 ANSI 标准 USING 子句。如果您是其中之一,那么您可以这样做:

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

否则,您将不得不明确列出您想要的列。

【讨论】:

  • 这对我来说是新的。因此,当您使用USING 时,当您使用SELECT * 时,该列仅在结果中出现一次?
  • @Lamak 是的。很难在 sql using 上找到搜索结果,因为它是一个常用词,但请阅读质量文档中的重新选择/加入语法——例如 MySQL、Oracle、Postgres。在标准下,你甚至不能在using 列上添加点。
【解决方案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

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 2022-08-18
    • 2011-02-12
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多