【问题标题】:How to join two tables with one of them not having a primary key and not the same character length如何连接两个表,其中一个表没有主键且字符长度不同
【发布时间】:2011-12-26 15:19:46
【问题描述】:

我正在处理两个表: "dyndomrun.ddid" = 带有主键和 "domainregion.domainid" = 没有任何主键或外键。

“dyndomrun.ddid”定义是“字符变化”,有8个字符,而“domainregion.domainid”定义也是“字符变化”,有10个字符。

问题:domainregion 表中的某些字段需要与 dyndomrun 表中的主键连接在一起。我似乎无法使用如下简单的 JOIN 语句来做到这一点:

SELECT domainregion.domainid, domainregion.dombegin, domainregion.domend, dyndomrun.ddid 
FROM domainregion, dyndomrun 
WHERE domainregion.domainid = dyndomrun.ddid 
ORDER BY domainregion.domainid, dyndomrun.ddid, domainregion.dombegin, domainregion.domend;

我尝试过 JOINS、INNER JOINS、LIKE,它们似乎都不起作用。我正在处理的数据库是使用 PostgreSQL 存储的纯 SQL。

有没有一种我可以使用的方法,它根据字符的长度选择 domainregion.domainid 并匹配它 dyndomrun.ddid?

请指教。

【问题讨论】:

  • 在进行连接时将 2 中的较大者转换为其他数据类型/精度
  • where left(domaainregion.domainID,8)=left(dyndomrun.ddid,8) 可能需要填充空格。 (但这是一般的想法,而不是“具体的答案”
  • 是这样的select CAST (domainregion.domainid AS "DomainRegion" AND dyndomrun.ddid AS "DynDomrun") from domainregion, dyndomrun where left(domainregion.domainid,8)=left(dyndomrun.ddid,8) order by domainregion.domainid, dyndomrun.ddid;

标签: sql postgresql


【解决方案1】:

尝试仅比较前 8 个字符:

SELECT r.domainid, r.dombegin, r.domend, d.ddid 
FROM   domainregion r
JOIN   dyndomrun d ON r.domainid::varchar(8) = d.ddid 
ORDER  BY r.domainid, d.ddid, r.dombegin, r.domend;

演员表隐式修剪尾随字符。 ddid 开头只有 8 个字符。也不需要处理。这实现了相同的效果:

JOIN   dyndomrun d ON left(r.domainid, 8) = d.ddid 

但是,请注意字符串函数left() 仅在 PostgreSQL 9.1 中引入。在早期版本中,您可以替换:

JOIN   dyndomrun d ON substr(r.domainid, 1, 8) = d.ddid

__

初学者基本解释:

  • 查询使用JOIN。阅读more about that in the manual

  • FROM domainregion rFROM domainregion AS r 的缩写。在这种情况下,AS 在 PostgreSQL 中只是噪音。 表别名 使查询更短且更易于阅读,但在这里没有其他影响。例如,您还可以使用表别名多次包含同一个表。

  • 连接条件ON r.domainid::varchar(8) = d.ddid 仅将两个表达式完全匹配的那些行连接在一起。再次阅读那些basics in the manual(或任何其他来源)。

这是一个简单的查询,这里不多解释。

【讨论】:

  • 请问domainregion "r" 代表什么?
  • 它是一个别名,因此您不必每次都输入 domainregion。你在哪里看到 r.domainid 这意味着用 domainregion 替换“R”
  • 感谢您的清晰解释。但是,我还有另一个问题。你介意帮我看看吗。 link
  • @jeiman90:我添加了一些基本解释和答案链接。
猜你喜欢
  • 2015-02-13
  • 2014-08-04
  • 2012-01-26
  • 2022-08-20
  • 2014-09-30
  • 2019-12-23
  • 2014-11-02
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多