- PR -

テーブルの結合が上手くできません

1
投稿者投稿内容
コウイチ
常連さん
会議室デビュー日: 2003/11/04
投稿数: 48
投稿日時: 2006-02-23 20:23
ACCESS 2003 を使っています。(Windows2000)

[TEST1]テーブル
TIME VALUE
01 5
02 3
03 4
04 1
05 1

[TEST2]テーブル
NO TIME
AAA 01
AAA 05
BBB 01
BBB 02
BBB 04
CCC 01
CCC 03

2つのテーブル(TEST1,TEST2)を結合して
下記のように取得したいと思っています。
TIMEの01〜05を必ず表示したいと思っています。

[ほしい結果]
NO TIME VALUE
AAA 01 5
AAA 02 0
AAA 03 0
AAA 04 0
AAA 05 1
BBB 01 5
BBB 02 3
BBB 03 0
BBB 04 1
BBB 05 0
CCC 01 5
CCC 02 0
CCC 03 4
CCC 04 0
CCC 05 0

TIMEフィールドでLEFT JOINすれば、
[TEST1]側のすべての行が表示される(右にない行はnull)と思ったんですが・・・。

SELECT TEST2.NO,TEST1.TIME,TEST1.VALUE
FROM TEST1 LEFT JOIN TEST2
ON TEST1.TIME=TEST2.TIME
ORDER BY TEST2.NO,TEST1.TIME

[上記SQLでの結果]
NO TIME VALUE
AAA 01 5
AAA 05 1
BBB 01 5
BBB 02 3
BBB 04 1
CCC 01 5
CCC 03 4

と結果が返ってきます。
どのようなSQL文だと、上に書いたような結果が返ってくるでしょうか?
よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-23 21:10
引用:

コウイチさんの書き込み (2006-02-23 20:23) より:

TIMEフィールドでLEFT JOINすれば、
[TEST1]側のすべての行が表示される(右にない行はnull)と思ったんですが・・・。


求める結果は JOIN じゃないですね。

コード:

    SELECT
        TEST2.NO,
        TEST2.TIME,
        TEST1.VALUE
    FROM
        TEST2, TEST1


と、単純にこういうことではないのでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2006-02-23 21:29
この質問は単に技術的な興味ですか。
それとも業務を行っている上で出てきた問題ですか?

後者であれば、この質問の中に出てこなければならないテーブルがもう一つあるんじゃないですかねぇ。
仮にそれをTEST3と呼びましょうか。
TEST2はTEST1とTEST3の関連の情報を表すテーブルになっているんだと思います。

[TEST3]テーブル
NO COL1 COL2
AAA XXX XXX
BBB XXX XXX
CCC XXX XXX

こういうテーブルがあるでしょ?
結論としては、TEST1とTEST3を結合するのが正しい。
とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 2006-02-23 23:38
TIMEは数字と仮定しています。
私はACCESSのSQLを知らないので、問題は「ACCESSがこのSQLを処理できるか?」ですね。
コード:
SELECT

TESTN_TBL.NO
, TEST1_TBL.TIME
, COALESCE(SIGN(TEST2_TBL.TIME), 0) * TEST1_TBL.VALUE AS VALUE
FROM TEST1_TBL
INNER JOIN
(SELECT DISTINCT NO
FROM TEST2_TBL
) TESTN_TBL
ON 0=0
LEFT JOIN
TEST2_TBL
ON TEST1_TBL.TIME = TEST2_TBL.TIME
AND TESTN_TBL.NO = TEST2_TBL.NO
ORDER BY
TESTN_TBL.NO
, TEST1_TBL.TIME;
------------------------------------------------------------------------------

NO TIME VALUE
--- ------ -----------
AAA 1 5
AAA 2 0
AAA 3 0
AAA 4 0
AAA 5 1
BBB 1 5
BBB 2 3
BBB 3 0
BBB 4 1
BBB 5 0
CCC 1 5
CCC 2 0
CCC 3 4
CCC 4 0
CCC 5 0

15 record(s) selected.




[ メッセージ編集済み 編集者: とんくま 編集日時 2006-02-23 23:42 ]
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-02-24 12:34
コード:
SELECT
        TESTX.[NO],
        TESTX.TIME,
        IIF(ISNULL(TEST1.VALUE), 0, TEST1.VALUE) AS [VALUE]
FROM    ((
        SELECT DISTINCT
                TEST2.[NO],
                TEST1.TIME
        FROM TEST1, TEST2
        ) TESTX
        LEFT OUTER JOIN
        TEST2
        ON    TEST2.[NO]    = TESTX.[NO]
        AND   TEST2.TIME    = TESTX.TIME)
        LEFT OUTER JOIN
        TEST1
        ON    TEST1.TIME    = TEST2.TIME
ORDER BY
        TESTX.[NO],
        TESTX.TIME


で期待している結果が得られると思います。


引用:

コード:
    SELECT
        TEST2.NO,
        TEST2.TIME,
        TEST1.VALUE
    FROM
        TEST2, TEST1




は、Accessでは明示的に記述することが出来ませんが、CROSS JOINと同意です。
なので、期待する結果は得られないでしょう。
コウイチ
常連さん
会議室デビュー日: 2003/11/04
投稿数: 48
投稿日時: 2006-02-26 21:57
じゃんぬさん、
一郎さん、
とんくまさん
うにくまさん、返事ありがとうございます。
返事遅くなってすみません。
金曜の朝に返事を書いてたんですが、書き終わる前に出張に行く時間になってしまい
返事することができませんでした><

とんくまさんのを試したのですが、
Accessでは、
COALESCEは IIF(ISNULL()) への置き換えができたのですが、
INNER JOIN の条件の 0=0 がダメみたいで上手く行きませんでした。

うにくまさんのを試したところ期待している結果ができました。
ありがとうございます。

確かに期待していた結果だったのですが、
私の質問の仕方が悪かく、自分が本当にほしい結果にはなりませんでしたので、
再度、質問します。
最初の質問では、TEST1、TEST2の2つテーブルを書いていましたが、
本当は、テーブルは1つになります。
コード:
[TEST_TBL]
NAME  TIME  KAISU
AAA     01      2
AAA     02      1
BBB     01      1
BBB     03      1
CCC     01      2
CCC     02      3

AAA,BBB,CCCさんそれぞれに、
SELECT TIME, SUM(KAISU) as [TOTAL] FROM TEST_TBL GROUP BY TIME

01 5
02 4
03 1

の結果を付けて、以下のように出力したいと考えています。

コード:
NAME  TIME  KAISU  TOTAL
AAA     01      2      5
AAA     02      1      4
AAA     03      0      1
BBB     01      1      5
BBB     02      0      4
BBB     03      1      1
CCC     01      2      5
CCC     02      3      4
CCC     03      0      1

申し訳ありませんが、
よろしくお願いします。
1

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