SQLについて

解決


乙女  2003-02-13 19:21:03  No: 2898

こんばんは。
今日は、Delphiと直接関係ないかもしれないのですが
SQLについてお聞きしたいことがあります。
使用しているのは
Delphi7pro
Paradox
BDE
です。

Aテーブル
NO
NAME
GroupID

Bテーブル
GroupID
GroupName

というテーブルがあります。
仮に、
Aテーブル
NO  Name  GroupID
1   AAAA  1
2   BBBB  8
3   CCCC  4

Bテーブル
GroupID   GroupName
1         A課
2         B課
3         C課
4         D課
5         E課
6         F課
7         G課
8         H課

だったとします。
TQueryのSQL.Textに
SELECT  Aテーブル.NO,
        Aテーブル.Name,
        Bテーブル.GroupName
FROM Aテーブル 
INNER JOIN Bテーブル ON Aテーブル.Group.ID = Bテーブル.GroupID;

とした場合、結果として

NO  Name  GroupName
1   AAAA  A課
2   BBBB  H課
3   CCCC  D課

となってほしいんですが、必ず、8件でてきてしまいます。
INNER  JOINではなく、LEFT・RIGHT  JOINにしても、同じ結果が返ってきます。

SQL文の間違いかと思い、ACCESSで簡易にクエリーを作成しましたが、
INNER  JOINで思い通りの結果が返ってきます。

と、いう事は、SQLは多分間違ってないのだと思っています。

DELPHIのTQueryでJOINを使うのに気をつけないといけないことは
あるのでしょうか?

それとも、根本的に、SQL自体が間違っているのでしょうか?

識者の方、どうかお知恵をお貸しください。

宜しくお願いいたします。


にしの  2003-02-13 21:16:20  No: 2899

こちらの環境でテストするとちゃんと3件だけ出てきますよ。
# Delphi5Pro+Paradox7+BDE

SQLは、
SELECT A.Name, BTABLE.GroupName
FROM ATABLE A
INNER JOIN BTABLE ON ATABLE.GroupID = BTABLE.GroupID;

上で示されたSQLは、Group.IDとなっていたのですが、違いますよね?


乙女  2003-02-13 23:29:04  No: 2900

にしのさんありがとうございます。

>上で示されたSQLは、Group.IDとなっていたのですが、違いますよね?
は単なる書き間違いです。

すいませんでした。

やはり、うまくいきません。

>SELECT A.Name, BTABLE.GroupName
>FROM ATABLE A
>INNER JOIN BTABLE ON ATABLE.GroupID = BTABLE.GroupID;


>SELECT ATABLE.Name, BTABLE.GroupName
>FROM ATABLE 
>INNER JOIN BTABLE ON ATABLE.GroupID = BTABLE.GroupID;

ってことですよね。

>FROM ATABLE A
のAに意味はないですよね?

これで、何日か迷っています。
デスクトップツールのSQLでも試したので
TQUERYのせいではなさそうな気がします。

それと、不可解なのが、
LEFT  JOINとしても、RIGHT  JOINとしても、同じ結果が返ってくることです。
ちなみに、AAAA  JOINでも、動きます。
EDASEFE  JOINでも動きます。
何故でしょう?

AAAAの部分には何を入れても動いてしまうのです。

これは、何かおかしいのでしょうか?
こういった経験をお持ちの方は、おられますでしょうか?

よろしければ、三度お知恵をお貸しください。


にしの  2003-02-13 23:57:13  No: 2901

Aは必要なかったです。
Aをとるなら、A.NameをATABLE.Nameと置き換えてください。

問題をもう一度確認します。
こちらで行った検証です。
まず、ATABLE.db, BTABLE.dbを、Database Desktop7(Delphi付属のDBツール)を使って作成しました。
DBの種類はParadox7。
構造は、以下の通り。

ATABLE
NO        カウンタ型(+)     キー(*)
NAME      文字型(A)     10
GroupID   整数型(S)

BTABLE
GroupID   カウンタ型(+)     キー(*)
GroupName 文字型(A)     10

それから、Database Explorerで、エイリアスを作成しました。このエイリアスには、上のATABLE,BTABLEしか入れてありません。

TDataSourceコンポーネント(name:=DataSource1)と、TQueryコンポーネント(name:=Query1)、TDBGridコンポーネント(name:=DBGrid1)を貼り付け、それぞれ以下のようなプロパティを設定しました。

[DataSource1]
DataSet: Query1

[Query1]
Active: True
DatabaseName: STANDARD1     // Database Explorerで作成したエイリアス名
SQL:
SELECT ATABLE.Name, BTABLE.GroupName
FROM ATABLE
INNER JOIN BTABLE ON ATABLE.GroupID = BTABLE.GroupID;

[DBGrid1]
DataSource: DataSource1

以上です。
これで、正しいデータが表示されています。

この手順以外で起きている現象ですか?
また、同じ手順で作成しても起きますか?


乙女  2003-02-14 00:08:05  No: 2902

にしのさん。
ほんとありがとうございました。

いろいろとご親切にしていただき、ありがとうございます。

>SELECT ATABLE.Name, BTABLE.GroupName
>FROM ATABLE
>INNER JOIN BTABLE ON ATABLE.GroupID = BTABLE.GroupID;
のSQL文ですが、

私は、テーブルというものを勘違いしてました。

SELECT ATABLE.DB.Name, BTABLE.DB.GroupName
FROM ATABLE.DB
INNER JOIN BTABLE.DB ON ATABLE.DB.GroupID = BTABLE.DB.GroupID;

としてました。
全てのテーブル名.DBとしておりました。

それをとってみたら、うまくいきました。

ほんとに申し訳ありませんでした。

いろいろと、お手数おかけしまして、どうもすいませんでした。


乙女  2003-02-14 01:35:42  No: 2903

すいません
忘れてました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加