PostgreSQL上のテーブル構造
社員0:G_ID、社員属性(生年月日、性別、現住所等)
社員1:G_ID、Jno
社員2:時点、Jno、所属情報、autoNo
①Access上にPostgreのODBCリンクテーブルを作成し、3者テーブルを内部結合をして、データ抽出
SELECT c.時点, c.兼務区分, a.G_ID, b.Jno, a.氏名, c.社員区分, c.会社名
FROM (社員0 INNER JOIN 社員1 ON 社員0.G_ID = 社員1.G_ID) INNER JOIN 社員2 ON 社員1.Jno = 社員2.Jno
WHERE c.時点=#6/1/2025# AND c.兼務区分="本務" AND c.社員区分="職員"
②パススルークエリ
SELECT c."時点", c."兼務区分", a."G_ID", b."Jno", a."氏名", c."社員区分", c."会社名",
FROM "社員0" as a JOIN "社員1" as b ON a."G_ID" = b."G_ID" JOIN "社員2" as c ON b."Jno" = c."Jno"
WHERE c."時点"='6/1/2025' and c."兼務区分"='本務' AND c."社員区分"='職員'
②のパススルークエリは正しく抽出できますが、①のリンクテーブルに対してAccessのSQLで抽出した場合、
例えば、時点抽出:〇、兼務区分:〇、社員区分:✖のように
抽出が利くフィールドと利かないフィールドがあります。
アドバイスいただけますと幸いです。
追加コメント
社員2に対し、10フィールドにおよび複合キーを設定したり、試行錯誤していましたが、
これを辞めて、AutoNo的なIDを追加してこれを主キーとして追加したところ、
これを検索キーとしては一切使っていないのですが、、、正しくデータ抽出できるようになりました。
G_IDは、従業員IDの事ですか?時点は、所属開始年月の事ですか?Jnoは、何を示しているのでしょう?特殊な暗号ですか?修正したほうが質問者も回答者もスムーズにやりとりできるでしょう。
名簿0は従業員テーブルですか?名簿3は従業員所属テーブルですか?名簿3は他のテーブルを外部参照するの?それとも、他のテーブルから参照されるの?
りんごさん、ありがとうございます。
説明不足でしたので補足します。
G_IDは雇用元(本籍)の従業員IDです、Jnoは出向(兼務)している会社毎に付与されるIDです。
つまり、出向元JnoをG_IDとして、出向した場合に、出向先会社毎にJnoを付与します。
G_ID:111 A社本籍 Jno:111
G_ID:111 B社出向 Jno:112
G_ID:111 C社出向 Jno:113
社員0は社員の属性管理
(G_ID:111、生年月日:2000/1/3、性別:男性、現住所:台東区浅草1-1-1)
社員1はG_IDとJnoの組み合わせ管理(出向先管理)
(G_ID:111、Jno:111
G_ID:111、Jno:112
G_ID:111、Jno:113)
社員2は、出向先の所属管理
(jno:111、会社:A社、部門:総務
jno:112、会社:B社、部門:人事総務
jno:113、会社:C社、部門:人事)
以上、よろしくお願いいたします。
名簿0のG_ID(主キー)と名簿1のG_ID(主キー、かつ、外部キー)が内部結合、
名簿1のJno(主キー)と名簿2のJno(外部キー)が内部結合
しています
>2
>3
これを記載通りに読むと次のようになります。社員テーブル、会社部門テーブル、社員会社部門テーブルで、会社部門テーブルの主キーはautoNoではなくJnoです。そして、ほとんどの場合出向元Jno=G_IDになり得ません。
主キーの変更、リレーションシップの設定からやり直しが必要になるので、急がば回れ、まずはきちんと土台から正規化するのはどうでしょう。
繰り返しになりますが、こいう運用をしているのです。
G_IDは雇用元(本籍)の従業員IDです、Jnoは出向(兼務)している会社毎に付与されるIDです。
つまり、出向元JnoをG_IDとして、出向した場合に、出向先会社毎にJnoを付与します。