こんばんは。
今日は、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自体が間違っているのでしょうか?
識者の方、どうかお知恵をお貸しください。
宜しくお願いいたします。
こちらの環境でテストするとちゃんと3件だけ出てきますよ。
# Delphi5Pro+Paradox7+BDE
SQLは、
SELECT A.Name, BTABLE.GroupName
FROM ATABLE A
INNER JOIN BTABLE ON ATABLE.GroupID = BTABLE.GroupID;
上で示されたSQLは、Group.IDとなっていたのですが、違いますよね?
にしのさんありがとうございます。
>上で示された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の部分には何を入れても動いてしまうのです。
これは、何かおかしいのでしょうか?
こういった経験をお持ちの方は、おられますでしょうか?
よろしければ、三度お知恵をお貸しください。
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
以上です。
これで、正しいデータが表示されています。
この手順以外で起きている現象ですか?
また、同じ手順で作成しても起きますか?
にしのさん。
ほんとありがとうございました。
いろいろとご親切にしていただき、ありがとうございます。
>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としておりました。
それをとってみたら、うまくいきました。
ほんとに申し訳ありませんでした。
いろいろと、お手数おかけしまして、どうもすいませんでした。
すいません
忘れてました。
ツイート | ![]() |