如何连接两个表,其中一个表没有主键,而且字符长度不同

时间:2011-12-26 15:19:47

标签: sql postgresql

我正在处理两个表: “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,它们似乎都没有用。我正在处理的数据库纯粹基于SQL,使用PostgreSQL存储。

我是否可以使用一种方法,根据字符的长度选择domainregion.domainid并将其与dyndomrun.ddid匹配?

请告知。

1 个答案:

答案 0 :(得分: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的缩写。在PostgreSQL中,AS只是噪音。 表别名使查询更短,更易于阅读,但此处没有其他影响。例如,您也可以使用表别名多次包含同一个表。

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

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