- PR -

複数テーブルのjoin

投稿者投稿内容
ぷさいくろう
ぬし
会議室デビュー日: 2006/08/30
投稿数: 1034
投稿日時: 2006-09-22 15:35
完全外部結合
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-09-22 18:50
ユニオンでも出来ますが、完全外部結合の方が分かりやすいかも知れません。

完全外部結合の場合
コード:
SELECT
        OYAT.KNAME,
        CHILDT.MEN_NAME,
        CHILDT.FEM_NAME
FROM    OYAT
        INNER JOIN
        (
        SELECT
                CASE
                WHEN    MENT.CODE IS NOT NULL
                        THEN    MENT.CODE
                WHEN    FEMT.CODE IS NOT NULL
                        THEN    FEMT.CODE
                END        CODE,
                CASE
                WHEN    MENT.SEQN IS NOT NULL
                        THEN    MENT.SEQN
                WHEN    FEMT.SEQN IS NOT NULL
                        THEN    FEMT.SEQN
                END        SEQN,
                MENT.CHILD                AS MEN_NAME,
                FEMT.CHILD                AS FEM_NAME
        FROM    MENT
                FULL OUTER JOIN
                FEMT
                ON  FEMT.CODE        =  MENT.CODE
                AND FEMT.SEQN        =  MENT.SEQN
        )   CHILDT
        ON  CHILDT.CODE         =  OYAT.CODE
ORDER BY
        OYAT.CODE,
        CHILDT.SEQN



ユニオンの場合
コード:
SELECT
        OYAT.KNAME,
        OYAT.CODE,
        CASE
        WHEN    MENT.SEQN IS NOT NULL
                THEN    MENT.SEQN
        WHEN    FEMT.SEQN IS NOT NULL
                THEN    FEMT.SEQN
        END        SEQN,
        MENT.CHILD,
        FEMT.CHILD
FROM    OYAT
        INNER JOIN
        FEMT
        ON  FEMT.CODE        =  OYAT.CODE
        LEFT OUTER JOIN
        MENT
        ON  MENT.SEQN        =  FEMT.SEQN
        AND MENT.CODE        =  FEMT.CODE
UNION
SELECT
        OYAT.KNAME,
        OYAT.CODE,
        CASE
        WHEN    MENT.SEQN IS NOT NULL
                THEN    MENT.SEQN
        WHEN    FEMT.SEQN IS NOT NULL
                THEN    FEMT.SEQN
        END        SEQN,
        MENT.CHILD,
        FEMT.CHILD
FROM    OYAT
        INNER JOIN
        MENT
        ON  MENT.CODE        =  OYAT.CODE
        LEFT OUTER JOIN
        FEMT
        ON  FEMT.SEQN        =  MENT.SEQN
        AND FEMT.CODE        =  MENT.CODE
ORDER BY
        OYAT.CODE,
        SEQN

とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 2006-09-24 20:28
最初の鳥さんの書き方で、よく分からないところがあります。
OYAT[CODE,KNAM]を私は、「OYATテーブルにCODE,KNAMの二つの列がある。」と解釈したのですが、そうするとデータの例のOYAT A1[1,KAWASAKI]の A1 の意味がよく分かりません。
欲しい結果が、A1-B1-C1 とかなっているので、勝手に列を追加して
コード:
CREATE TABLE OYAT
(ID   CHAR(2)  NOT NULL
,CODE SMALLINT NOT NULL
,KNAM SMALLINT NOT NULL
);
 
INSERT INTO OYAT
VALUES
 ('A1', 1, 'KAWASAKI')


などとして、テストしてみました。
コード:
SELECT O.id
       || '-' || COALESCE(M.id, 'NUL')
       || '-' || COALESCE(F.id, 'NUL')
  FROM OYAT O
       LEFT OUTER JOIN
       MENT M
       FULL OUTER JOIN
       FENT F
         ON  F.code = M.code
         AND F.seqn = M.seqn
         ON  O.CODE
             = COALESCE(F.code,M.code)
------------------------------------------------

1         
----------
A1-B1-C1  
A1-B2-C2  
A1-B3-NUL 

  3 record(s) selected.






スキルアップ/キャリアアップ(JOB@IT)