具有不同计数的SQL查询

具有不同计数的SQL查询,sql,database-table,Sql,Database Table,我正在尝试用Delphi编写SQL查询,但运气不好 我有两个表,第一个表保存个人数据,第二个表保存购买商品的信息 当我使用WHERE子句(我的键是person\u id)连接两个表时,我的查询工作正常 但是我想在我的查询中添加没有个人数据的记录,只是有人购买了商品,它们不会显示 所以在那些没有任何个人信息的记录中,我需要有空字符串或空值 是否可以在一个SQL查询中执行此操作 编辑:这是工作版本,但不包含与第一个表无关的第二个表的值 Query1.SQL.Add ('SELECT idcard,

我正在尝试用Delphi编写SQL查询,但运气不好

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

当我使用
WHERE
子句(我的键是
person\u 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 ');
Query1.SQL.Add('selectidcard、vnev、knev、kapcs');
Query1.SQL.Add('bsz、bt、kidate、ERVEGE、alkalmak来自“'+adathely+”、“'+berlethely+”);
Query1.SQL.Add('WHERE(“+adathely+”.idcard=“”+berlethely+”.idcard)”);
//从这里只进行过滤
Query1.SQL.Add('AND kidate>=“'+IntToStr(DateToInt(filterdate1.Text))+”);

Query1.SQL.Add('和ervvege我认为您编写了如下查询:

SELECT *
FROM Table1, Table2
WHERE Table1.person_id = Table2.person_id
SELECT *
FROM (the union query above) tables
WHERE ...all the conditions,
  except table1.idcard = table2.idcard that's already included in the join...
如果person_id出现在表1中,但不在表2中,则不会出现任何记录

请尝试左连接:

SELECT *
FROM Table1 LEFT JOIN Table2 on Table1.person_id = Table2.person_id
这将显示表1中的每条记录,即使它与表2中的记录不相关


编辑:如果左连接不够,您可能需要完全外部连接。如果您的DBMS不支持完全外部连接,您可以使用以下方法模拟它:

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 Table1, Table2
WHERE Table1.person_id = Table2.person_id
SELECT *
FROM (the union query above) tables
WHERE ...all the conditions,
  except table1.idcard = table2.idcard that's already included in the join...

只是为了让事情更具可读性。

我认为您编写了这样一个查询:

SELECT *
FROM Table1, Table2
WHERE Table1.person_id = Table2.person_id
SELECT *
FROM (the union query above) tables
WHERE ...all the conditions,
  except table1.idcard = table2.idcard that's already included in the join...
如果person_id出现在表1中,但不在表2中,则不会出现任何记录

请尝试左连接:

SELECT *
FROM Table1 LEFT JOIN Table2 on Table1.person_id = Table2.person_id
这将显示表1中的每条记录,即使它与表2中的记录不相关


编辑:如果左连接不够,您可能需要完全外部连接。如果您的DBMS不支持完全外部连接,您可以使用以下方法模拟它:

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 Table1, Table2
WHERE Table1.person_id = Table2.person_id
SELECT *
FROM (the union query above) tables
WHERE ...all the conditions,
  except table1.idcard = table2.idcard that's already included in the join...

只是为了让事情更具可读性。

你需要添加你的查询,我们看不出模糊语句有什么问题……你需要添加你的查询,我们看不出模糊语句有什么问题……谢谢你,但我认为我需要的是正确的外部连接(正如@marc_所说)。现在唯一的问题是,我的查询中不包括表2中的字段。这是因为您需要一个左外部联接!您可能需要一个完整的外部联接,显示表1中的每一行和表2中的每一行,即使它们不是左外部联接correlated@StevieG:谢谢,只需简单的右键连接就可以完美地工作。我需要弄清楚的是如何我让查询将空值放在列表的末尾。要对结果排序,您必须在查询的末尾添加一个
order BY field1、field2等。
子句。但是如果
field
包含空值,并且您想将该值放在列表的末尾,您可以使用此order BY子句:
order BY field1为空,field为空2为空,等等。
(这在MySql中有效,但其他DBMS可能有不同的语法)谢谢,但我认为我需要右外部连接(正如@marc_s所说)。现在唯一的问题是,我的查询中不包括表2中的字段。这是因为您需要一个左外部联接!您可能需要一个完整的外部联接,显示表1中的每一行和表2中的每一行,即使它们不是左外部联接correlated@StevieG:谢谢,只需简单的右键连接就可以完美地工作。我需要弄清楚的是如何我让查询将空值放在列表的末尾。要对结果排序,您必须在查询的末尾添加一个
order BY field1、field2等。
子句。但是如果
field
包含空值,并且您想将该值放在列表的末尾,您可以使用此order BY子句:
order BY field1为空,field为空2为空,等等。
(这在MySql中有效,但其他DBMS可能有不同的语法)