如何匹配具有不同主键长度的两个表

时间:2011-12-23 15:36:15

标签: sql

我正在尝试从两个不同的表中引用两个主键,但问题是由于它的字符长度它们不匹配。

例如,person.personid = '1234'department.personid = '12345'

是否有一个SQL语句,我可以使用它来匹配主键的前4或5个字符,或者我可以使用任何其他方法。


更新:真诚的道歉。我正在处理两张桌子。 "dyndomrun.ddid"使用主键,"domainregion.domainid"没有任何主键或外键。 “dyndomrun”表DDL设置为"character varying"并且有8个字符,而“domainregion”表DDL也设置为“字符变化”但有10个字符。

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

)执行此操作
SELECT domainregion.domainid, dyndomrun.ddid 
FROM domainregion, dyndomrun 
WHERE domainregion.domainid = dyndomrun.ddid 
ORDER BY domainregion.domainid, dyndomrun.ddid;

我尝试过JOINS,INNER JOINS,LIKE,它们似乎都没有用。我正在处理的数据库纯粹基于SQL,使用PostgreSQL存储。

请告知。

3 个答案:

答案 0 :(得分:1)

你的意思是

select * 
  from t1
     , t2
 where to_char(t1.id) = substr(t2.id,1,4)

或其他方式:

select * 
  from t1
     , t2
 where t1.id = round(t2.id/10)

以上解决方案均假定t1.idt2.id短一个字符。

HTH

答案 1 :(得分:1)

试试这个......

SELECT * 
  FROM person
 INNER JOIN department ON person.personid = LEFT(department.personid,4)

答案 2 :(得分:1)

你的问题没有意义。我们不会将一个表的主键映射到另一个表的主键。

现在我们将依赖表的外键映射到引用表的主键。但在这种情况下,两个表中列的值必须匹配。 DEPARTMENT.PERSONID中的12345必须引用PERSON.PERSONID中的记录12345,因为.PERSON.PERSONID中的1234实际上是另一个人。

也许你正在使用一个糟糕的数据模型,其中依赖表有一些智能键,其中只有一部分引用了父键。如果是这样的话,我表示哀悼。但是您需要提供一些具体细节,以及DBMS风格的一些指示(因为不同产品的解决方案会有所不同)。

但是你最大的问题是:一旦你尝试在除列之间的相等之外的任何事情上应用关系完整性,你就有可能在.PERSON.PERSONID中将1234与DEPARTMENT.PERSONID中的1234匹配,DEPARTMENT.PERSONID中的DEPARTMENT.PERSONID 12345中的123456。这可能不是你想要的。