1

我正在尝试在 Delphi 中编写 SQL 查询,但没有运气。

我有两张表,第一张保存个人数据,第二张保存有关购买商品的信息。

当我用WHERE子句连接两个表时,我的查询工作正常(我的键是person_id)。

但我想在我的查询中添加没有个人数据的记录,只是有人购买了商品,他们不显示。

因此,在那些没有任何个人信息的记录中,我需要有空字符串或空值。

是否可以在一个 SQL 查询中完成?

编辑:这是工作版本,但这不包含与第一个表无关的第二个表的值。

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

如果 table1 中存在 person_id 而 Table2 中没有,则不会出现任何记录。

尝试使用 LEFT JOIN 代替:

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

这将显示 Table1 中的每条记录,即使它与 Table2 中的记录不相关。

编辑:如果左连接还不够,您可能需要完全外连接。如果你的 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 回答