1

Delphi で SQL クエリを作成しようとしていますが、うまくいきません。

2 つのテーブルがあり、最初のテーブルには個人データが保持され、2 番目のテーブルには購入した商品に関する情報が保持されます。

2 つのテーブルをWHERE句で接続すると、クエリが正常に機能します (私のキーは ですperson_id)。

しかし、個人データがなく、誰かが商品を購入しただけで表示されないレコードをクエリに追加したいと考えています。

したがって、個人情報がないレコードでは、空の文字列または null 値が必要です。

1 つの SQL クエリで実行できますか?

編集: これは作業バージョンですが、これには最初のテーブルに関連しない 2 番目のテーブルの値は含まれていません。

Query1.SQL.Add ('SELECT idcard, vnev, knev, kapcs, ');
Query1.SQL.Add ('bsz, bt, kidate, ervvege, alkalmak FROM "'+adathely+'", "'+berlethely+'" ');
Query1.SQL.Add ('WHERE ("'+adathely+'".idcard = "'+berlethely+'".idcard) ');
//from here only filtering occurs
Query1.SQL.Add ('AND kidate >= "'+IntToStr(DateToInt(filterdate1.Text))+'" ');
Query1.SQL.Add ('AND ervvege <= "'+IntToStr(DateToInt(filterdate2.Text))+'" ');
Query1.SQL.Add ('AND CAST(bsz AS CHAR(6)) LIKE '''+filterbsz.Text+'%''  ');
Query1.SQL.Add ('AND ((LOWER(vnev) LIKE ''%'+filtername.Text+'%'') OR (LOWER(knev) LIKE ''%'+filtername.Text+'%''))  ');
Query1.SQL.ADD ('ORDER BY vnev ASC ');

簡単な説明: table1 は「adathely」 table2 は「berlethely」 両方のテーブルには「idcard」フィールドが含まれていますが、table2 にはこのフィールドに値を持たないレコードがありますが、stringgrid にも表示したいと思います。

4

1 に答える 1

1

次のようなクエリを書いたと思います:

SELECT *
FROM Table1, Table2
WHERE Table1.person_id = Table2.person_id

person_id が Table1 に存在し、Table2 に存在しない場合、レコードは表示されません。

代わりに LEFT JOIN を試してください:

SELECT *
FROM Table1 LEFT JOIN Table2 on Table1.person_id = Table2.person_id

これにより、Table2 のレコードに関連付けられていない場合でも、Table1 のすべてのレコードが表示されます。

編集:左結合では不十分な場合は、おそらく FULL OUTER JOIN が必要です。DBMS が FULL OUTER JOIN をサポートしていない場合は、これを使用してシミュレートできます。

SELECT *
FROM Table1 LEFT JOIN Table2 on Table1.person_id = Table2.person_id
UNION SELECT *
FROM Table1 RIGHT JOIN Table2 on Table1.person_id = Table2.person_id

where句には多くの条件があるため、クエリを次のように書くことをお勧めします。

SELECT *
FROM (the union query above) tables
WHERE ...all the conditions,
  except table1.idcard = table2.idcard that's already included in the join...

物事を読みやすくするためだけに。

于 2012-11-15T14:22:42.347 に答える