我正在尝试在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中显示它们。
答案 0 :(得分: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中的每条记录,即使它与表2中的记录无关。
编辑:如果左连接不够,您可能需要一个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...
只是为了让事情更具可读性。