2011-12-23 7 views
2

2つの異なるテーブルから2つのプライマリキーを参照しようとしていますが、文字の長さのために一致しないという問題があります。異なるプライマリキーの長さを持つ2つのテーブルを一致させる方法

例:person.personid = '1234'およびdepartment.personid = '12345'

プライマリキーの最初の4文字または5文字と一致させるために使用できるSQL文がありますか、それとも他にも使用できる方法があります。


更新:よろしくお願いいたします。私は2つのテーブルを扱っています。 "dyndomrun.ddid"にはプライマリキーがあり、"domainregion.domainid"にはプライマリキーも外部キーもありません。 "dyndomrun"テーブルDDLは"character varying"に設定され、8文字ですが、 "domainregion"テーブルDDLも "character varying"に設定されていますが、10文字です。

問題テーブルの主キーと一緒に結合する必要があるフィールドが、domainregionテーブルにあります。私はLIKE、それらのどれも動いていないようにみえ、内部結合、JOINS試してみましたが、このような

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

以下のような単純なSQL文でこれを行うように見えることはできません。私が扱っているデータベースは、PostgreSQLを使用して純粋にSQLベースで格納されています。

お知らせください。

+2

どのデータベースエンジンですか? MySQL? SQLサーバー?オラクル?その他? – ean5533

+1

カラムp_person_idとd_person_idを持つマッピングテーブルを作成する –

+2

通常、テーブル間のプライマリキーは一致しません - 一方のテーブルの**外部キー**は別のテーブルの**プライマリキー**を参照し、これら2つは同一である必要がありますそのデータ型には –

答えて

1

あなたの質問は意味がありません。あるテーブルの主キーを別のテーブルの主キーにマッピングしません。

ここでは、従属テーブルの外部キーを参照先テーブルの主キーにマッピングします。しかし、その場合、両方のテーブルの列の値が一致しなければなりません。 .PERSON.PERSONIDの1234は文字どおり別の人物なので、DEPARTMENT.PERSONIDの12345はPERSON.PERSONIDのレコード12345を参照する必要があります。

おそらくあなたは、従属テーブルが親キーを参照するスマートキーを一部しか持たない、すばらしいデータモデルで作業していると思います。その場合、私の哀悼の意を表します。しかし、いくつかの具体的な詳細と、DBMSの味の示唆を与える必要があります(ソリューションは製品によって異なるため)。

しかし、あなたの最大の問題はこれです:あなたはDEPARTMENT.PERSONID にDEPARTMENT.PERSONIDで123412345と.PERSON.PERSONIDに1234を一致させる危険を冒す列間の等価性以外に、リレーショナル整合性を適用しようとしたら、 DEPARTMENT.PERSONIDの123456それはおそらくあなたが望むものではありません。

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よりも1つの文字短くなっていることを前提としています。

HTH

+0

私の問題は、特定のテーブルからフィールドのリストを選択する必要があることと、プライマリキーとして別のテーブルの中で、プライマリキーの異なる文字セットを使用して呼び出されるということです。主キーの種類は "character varying"なので、このエラー "指定された名前と引数の型に一致する関数はありません。明示的な型キャストを追加する必要があります。" – Jeiman

1

これを試してみてください...

SELECT * 
    FROM person 
INNER JOIN department ON person.personid = LEFT(department.personid,4) 
関連する問題