アプリ版:「スタンプのみでお礼する」機能のリリースについて

企業テーブルのIDをキーに、個人情報テーブル①と②が同じメアドの場合は横並びで、違う場合は隣は空欄にしたく、メアドがどちらもない場合は、企業名だけ表示させたいと思っております。

▼企業情報テーブル
ID 会社名
1 あああ
2 いいい
3 ううう
4 えええ

▼個人情報テーブル①
ID ①のメアド
1 aaa@co.jp
1 bbb@co.jp
2 ccc@co.jp

▼個人情報テーブル②
ID ②のメアド
1 bbb@co.jp
2 ddd@co.jp
2 eee@co.jp
3 fff@co.jp

▼アウトプットイメージ
ID 会社名 ①のメアド ②のメアド
1 あああ aaa@co.jp 空欄
1 あああ bbb@co.jp bbb@co.jp
2 いいい ccc@co.jp 空欄
2 いいい 空欄    ddd@co.jp
3 ううう 空欄    fff@co.jp
4 えええ 空欄    空欄

実際にIDを結合してクエリを実行すると
以下のように同じメアドが繰り返され空欄にはならず
①と②のメアドが同じものが横並びになりません。。

ID 会社名 ①のメアド ②のメアド
1 あああ aaa@co.jp bbb@co.jp
1 あああ bbb@co.jp bbb@co.jp
2 いいい ccc@co.jp ddd@co.jp
2 いいい ccc@co.jp eee@co.jp
3 ううう 空欄    fff@co.jp
4 えええ 空欄    空欄

アウトプットイメージのように出すのは難しいでしょうか?

A 回答 (17件中1~10件)

よかったですね!


email1=email2の条件式は、メアドが同じ場合、同じ行にする(横に表示)ために必須な条件式でした。
もう一つの方法は、今回の条件式が動けば必要ないので、(2)に進みましょう。
以前に提示したものに、今回の条件式を反映したので、前の回答は見なくていいです。

(2)個人情報Bにはあり、個人情報Aにはないものを含めて結合

SELECT
id1,email1,id2,email2
FROM 個人情報A
RIGHT JOIN 個人情報B
ON (個人情報A.id1 = 個人情報B.id2) AND (個人情報A.email1 = 個人情報B.email2)
;

(3)(1)と(2)の結果を縦につなげる。両方にあるものは重複排除(一つだけ得る)

SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON (個人情報A.id1 = 個人情報B.id2) AND (個人情報A.email1 = 個人情報B.email2)
UNION
SELECT
id1,email1,id2,email2
FROM 個人情報A
RIGHT JOIN 個人情報B
ON (個人情報A.id1 = 個人情報B.id2) AND (個人情報A.email1 = 個人情報B.email2)
;

(4)企業情報と(3)を結合。企業情報だけにあるものを含む。

SELECT
kg.id,namae,email1,email2
FROM 企業情報 AS kg
LEFT JOIN
(
SELECT
IIF(id1 IS NULL,id2,id1) AS id
,email1,email2
FROM(
SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON (個人情報A.id1 = 個人情報B.id2) AND (個人情報A.email1 = 個人情報B.email2)
UNION
SELECT
id1,email1,id2,email2
FROM 個人情報A
RIGHT JOIN 個人情報B
ON (個人情報A.id1 = 個人情報B.id2) AND (個人情報A.email1 = 個人情報B.email2)
) AS x
) AS y
ON kg.id=y.id
ORDER BY kg.id,email1,email2
;
    • good
    • 1
この回答へのお礼

(4)まで実行できました!!!!
本当に本当にありがとうございます;;

以下が結果になります。
id namae email1 email2
1 あああ aaa@co.jp
1 あああ bbb@co.jp bbb@co.jp
2 いいい    ddd@co.jp
2 いいい    eee@co.jp
2 いいい ccc@co.jp
3 ううう    fff@co.jp
4 えええ

こんなに親切丁寧に対応してくださり、最後までつきあっていただき
とても感謝しております。
本当に本当にありがとうございました!!!
もしSQLのYoutubeやブログなどやってましたら
ぜひフォローさせていただき、勉強させていただきたいので
URLなど教えていただけるとありがたいです。

お礼日時:2022/08/20 21:45

SNSとかはやろうと思った時期もあったのですが、やってません。


Yahoo!知恵袋では、たびたび回答者になってます。
https://chiebukuro.yahoo.co.jp/my

Yahoo!知恵袋は、データベースについても活発に質問や回答があるので、ここよりオススメです。
質問や回答を、「ちょっと後悔」といった場合に、削除できるのも利用しやすいです。
Yahoo!知恵袋で質問してくれたら、また回答することもあるかも知れません。

「教えてgoo」のアプリがあって、それで見てたのですが、操作性が悪すぎでした。今回のやり取りでも、途中からアプリでなく、webを使ったりしました。
    • good
    • 1
この回答へのお礼

ご返信ありがとうございます。
知恵袋ぜひ活用させていただきます!
操作性も悪い中、最後まで丁寧に分かりやすくご対応くださり
本当に本当にありがとうございました!!
とても感謝しております。

お礼日時:2022/08/21 08:07

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー


クエリ式'(個人情報A.id1 = 個人情報B.id2) AND (個人情報A.email1 = 個人情報B.email2)

SELECT
id'の構文エラー
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

二つのSELECT文を一緒に実行しましたか?
エラー検知した部分が' 'で囲まれて表示されてますが、最初の方は一つ目の条件式部分。つまりSELECT文の最後の部分です。
そして最後の方は二つ目のSELECT文の先頭部分です。
ACCESSは二つのSELECT文を、一度に実行できるのか知らないのですが、できるなら最初のSELECT文の最後に「;」(セミコロン)が入ってないから続きと思われたのかもしれません。
「;」(セミコロン)を入れて試してもらえますか。

SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON (個人情報A.id1 = 個人情報B.id2) AND (個人情報A.email1 = 個人情報B.email2)
;

②No.12の変形

SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON (Cstr(個人情報A.id1)+個人情報A.
email1=Cstr(個人情報B.id2)+個人情報B.email2)
;
    • good
    • 1
この回答へのお礼

ご確認いただき本当にありがとうございます。

;を入れて2つ続けて、実行したところ
「SQLステートメントの後に文字が見つかりました」
と出ましたので、以下の構文だけ実行したところ
エラーがなくなりました!

ーーーーーーーーーーーーーーーーーーーーーーーー
SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON (個人情報A.id1 = 個人情報B.id2) AND (個人情報A.email1 = 個人情報B.email2)
;
ーーーーーーーーーーーーーーーーーーーーーーーーー

その結果が以下になりました!
id1 email1   id2  email2
1 aaa@co.jp 空欄 空欄
1 bbb@co.jp 1 bbb@co.jp
2 ccc@co.jp 空欄 空欄

2個目の構文を実行する場合はどうしたらいいか
お分かりになりますでしょうか?
何度もお手数をおかけして申し訳ありません。。

お礼日時:2022/08/20 19:58

「ON句では表名を省略するとアウト」との回答を得ました。



No.11〜No.13の再試行は一旦なしで、次の二つを試してもらえますか?

①No.11の(b)の変形

SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON (個人情報A.id1 = 個人情報B.id2) AND (個人情報A.email1 = 個人情報B.email2)

②No.12の変形

SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON (Cstr(個人情報A.id1)+個人情報A.
email1=Cstr(個人情報B.id2)+個人情報B.email2)
;
    • good
    • 1
この回答へのお礼

早々にご返信ありがとうございます。

以下のエラーが出ましたので見ていただけますでしょうか。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
クエリ式'(個人情報A.id1 = 個人情報B.id2) AND (個人情報A.email1 = 個人情報B.email2)

SELECT
id'の構文エラー
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

お手数おかけして申し訳ありませんが
引き続きよろしくお願いいたします。

お礼日時:2022/08/20 09:06

試して欲しい方法の内、後で提示した文字連結する方法を先に試してもらった方がいいかも知れません。


文字変換、文字連結の方法が問題なければ、動く可能性は高いように思います。
    • good
    • 0

文字列に変換+文字連結して、条件式を一つにしてみました。


試してみてもらえますか。

SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON Cstr(id1)+email1=Cstr(id2)+email2
;
    • good
    • 1
この回答へのお礼

参考になるか分からないのですが、
エラーのポップアップが出るとともに
先ほどの構文を実行した際に
以下の箇所が選択(文字をカーソル選択した状態)
されていることに気づきました。

Cstr(id1)+email1=Cstr(id2)+email2


以下の構文のエラーの場合は
id1=id2 AND email1=email2
ーーーーーーーー
SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON (id1=id2 AND email1=email2)
;
ーーーーーーーー

以下の構文のエラーの場合は
id1=id2
ーーーーーーーーー
SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON id1=id2 AND email1=email2
;
ーーーーーーーーー

お手数おかけして申し訳ございませんが
どうぞよろしくお願いします。

お礼日時:2022/08/20 08:42

私はACCESS環境を持っていないので、Yahoo!知恵袋で質問してみました。


https://detail.chiebukuro.yahoo.co.jp/qa/questio …

もしACCESSの仕様上、ON句で複数条件式はできない場合は、例えばid1とemail1を文字にして連結して、一つの条件式にするといったアイデアは持っていたりします。

回答がいつもらえるか分からないので、その間に少し試してもらえますか?

(a)試してみる
→条件式を一つにしてみる
(結果が異なるので今回は使わないけど、念のため)

SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON (id1=id2)
;

(b)試してみる→表名で修飾
SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON (個人情報A.id1=個人情報B.id2 AND 個人情報A.email1=個人情報B.email2)
;

(c)試してみる→表名で修飾+条件式それぞれを()で囲む
SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON ((個人情報A.id1=個人情報B.id2) AND (個人情報A.email1=個人情報B.email2))
;
    • good
    • 1
この回答へのお礼

知恵袋に質問までしてくださり本当にありがとうございます。

以下を試したのですが、すいません。。
「JOIN式はサポートされていません」
と出てきてしまいます。

ーーーーーーーーー
SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON Cstr(id1)+email1=Cstr(id2)+email2
;

お礼日時:2022/08/20 08:33

ACCESSの構文に特殊な制約があるみたいですね。


ON句での条件式を、()で囲んでやってみてもらえますか?

ON (id1=id2 AND email1=email2)
    • good
    • 1
この回答へのお礼

早々にご返信ありがとうございます。
申し訳ありません。。また
「JOIN式はサポートされていません
 OK  ヘルプ」
と出てしまいました。

ーーーーーーーーーー
SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON (id1=id2 AND email1=email2)
;

お礼日時:2022/08/19 22:38

お待たせしました。


列名(項目名)を確認しての再提示です。
(1)から順番に動くか試してみてください。
動かない場合は、その次には進まないでください。

(1)個人情報Aにはあり、個人情報Bにはないものを含めて結合

SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON id1=id2 AND email1=email2
;

(2)個人情報Bにはあり、個人情報Aにはないものを含めて結合

SELECT
id1,email1,id2,email2
FROM 個人情報A
RIGHT JOIN 個人情報B
ON id1=id2 AND email1=email2
;

(3)(1)と(2)の結果を縦につなげる。両方にあるものは重複排除(一つだけ得る)

SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON id1=id2 AND email1=email2
UNION
SELECT
id1,email1,id2,email2
FROM 個人情報A
RIGHT JOIN 個人情報B
ON id1=id2 AND email1=email2
;

(4)企業情報と(3)を結合。企業情報だけにあるものを含む。
-- COALESCE(id1,id2) AS id
-- ACCESSなら、
-- IIF(id1 IS NULL,id2,id1) AS id

SELECT
kg.id,namae,email1,email2
FROM 企業情報 AS kg
LEFT JOIN
(
SELECT
IIF(id1 IS NULL,id2,id1) AS id
,email1,email2
FROM(
SELECT
id1,email1,id2,email2
FROM 個人情報A
LEFT JOIN 個人情報B
ON id1=id2 AND email1=email2
UNION
SELECT
id1,email1,id2,email2
FROM 個人情報A
RIGHT JOIN 個人情報B
ON id1=id2 AND email1=email2
) AS x
) AS y
ON kg.id=y.id
ORDER BY kg.id,email1,email2
;
    • good
    • 1
この回答へのお礼

ご丁寧に対応くださり、本当にありがとうございます。

(1)個人情報Aにはあり、個人情報Bにはないものを含めて結合
→この段階で
「JOIN式はサポートされていません
 OK  ヘルプ」
とポップアップがでたのですが、ご確認いただけますでしょうか。
申し訳ありません。。

お礼日時:2022/08/19 18:46

表定義の列名(フィールド名)と、SELECT文が不整合になっているようです。


ACCESSでは、クエリ、ユニオンクエリなど別に作ることができるようですが、現状のSELECT文(クエリ)は、No.3のお礼で提示されたものから変更はないですか?

No.3のお礼のSELECT文は、表の列名(フィールド名、項目名)は、次のようになっている前提のものです。

企業情報→id,namae
個人情報A→id,email
個人情報B→id,email

No.4の回答で、各表の列名を一意にして同じ名前の列名をなくせば、SELECT文で「列名 AS 別名」や「表名.列名」といった列名に別名を付けたり、表名で修飾する必要がなくなることを説明し、SELECT文のパーツ例を示しました。

No.4のお礼で、テーブルの項目名を
id,namae,email1,email2
にしてなかった。
テーブルを修整して実行したら、「式で型が一致しません」になった。

No.5のお礼で最新の列名とデータ型について
企業情報→id,name
個人情報A→id,email1
個人情報B→id,email1

No.6のお礼では、No.5のお礼の追記として
id,id1,id2が倍精度〜
namae,email1,email2は255

お礼によって列名(項目名)がバラバラ、不一致になっています。
項目の定義やクエリの選択項目など、別々の方法で確認しているからなのでしょうか?

いずれにしても、一度、リセットする必要があると思います。
表定義、SELECT文(ACCESSのクエリやユニオンクエリなど複数あるならそれらも)を整理しましょう。

(1)企業情報、個人情報A、個人情報Bの最新というかこの項目名でやりたいというのを提示してください。
(2)クエリなど作成したものは、一旦、削除してください。
(3)(1)を反映したSELECT文を再度、提示します。
 その場合、SELECT文をパーツに分けて、段階的に確認してもらう方法にするかも知れません。
どこでエラーになっているか、その方が調べやすいですからね。
    • good
    • 1
この回答へのお礼

ご丁寧に整理までしていただきありがとうございます。
そして大変申し訳ございません。。
CREATEと書かれた文を試した際に、SELECT文は変わらないと思い込み
SELECT文は以前のままにしておりました。。

以下にテーブル名と項目を記載致します。

テーブル名:企業情報
id 数値型 倍精度浮遊小数点
namae 短いテキスト 255

テーブル名:個人情報A
id1 数値型 倍精度浮遊小数点
email1 短いテキスト 255

テーブル名:個人情報B
id2 数値型 倍精度浮遊小数点
email2 短いテキスト 255


何度もお手数おかけして申し訳ございませんが
どうぞよろしくお願いいたします。

お礼日時:2022/08/18 15:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す