Sql 连接4个表会漏掉很多行,我不知道为什么

Sql 连接4个表会漏掉很多行,我不知道为什么,sql,sqlite,join,Sql,Sqlite,Join,我正在使用Chinook数据库来练习SQLite,然后添加更多的搜索参数来提高严谨性 我试图提供一个查询,其中包括每个发票行项目的跟踪名称和客户名称以及每个跟踪的金额 发票行项目表中有2240个发票行项目,发票表中有412个发票,但下面的代码仅显示59个结果,即客户总数 我遗漏了什么阻止查询显示所有2240行 SELECT i.InvoiceLineId as 'Invoice Line ID', t.Name as 'Name of track purchased', i.UnitPrice

我正在使用Chinook数据库来练习SQLite,然后添加更多的搜索参数来提高严谨性

我试图提供一个查询,其中包括每个发票行项目的跟踪名称和客户名称以及每个跟踪的金额

发票行项目表中有2240个发票行项目,发票表中有412个发票,但下面的代码仅显示59个结果,即客户总数

我遗漏了什么阻止查询显示所有2240行

SELECT i.InvoiceLineId as 'Invoice Line ID', t.Name as 'Name of track purchased', i.UnitPrice as '$ Amount for Track', c.FirstName || ' ' || c.LastName as 'Customer Name'
FROM Track as t
JOIN InvoiceLine as i
    ON t.TrackId = i.InvoiceLineId
JOIN Invoice as i_n
    ON i.InvoiceLineId = i_n.InvoiceId
JOIN Customer as c
    ON i_n.InvoiceId = c.CustomerId;

从要保留所有内容的表开始,然后使用left join:


在SQLite中,联接的默认行为是内部联接。如前所述,使用2240行项目表中的左联接应该保留所有记录。或者,如果所有客户和跟踪ID都与发票关联,则也可以将JOIN替换为FULL JOIN


这个连接谓词在我看来有点可疑-在i_n.InvoiceId=c.CustomerId;,发票表中是否有CustomerID列,如果有,那么您可能应该加入该列,而不是InvoiceIDPlease in code问题给出一个-cut&paste&runnable代码,包括作为代码输入的最小代表性示例;期望和实际输出,包括逐字记录错误消息;标签和版本;清晰的说明和解释。尽可能少地给出代码,即显示为OK的代码,并通过显示为not OK的代码进行扩展。调试基础。对于包含DBMS和DDL(包括约束和索引)的SQL,请输入格式化为表的代码。暂停总体目标的工作,将代码切掉到第1个表达式,不要给出您期望的内容,说出您期望的内容和原因。您可能需要像il.tid=t.tid、il.iid=i.iid&i.cid=c.cid这样的测试。在给出业务关系/关联、表基或查询结果时,请说明其中的一行根据其列值对业务状况的说明。SQLite不支持完全联接。
FROM Invoice i_n LEFT JOIN
     InvoiceLine i
     ON i.InvoiceLineId = i_n.InvoiceId LEFT JOIN
     Track as t
     ON t.TrackId = i.InvoiceLineId LEFT JOIN 
     Customer as c
      ON i_n.InvoiceId = c.CustomerId
SELECT i.InvoiceLineId as 'Invoice Line ID', t.Name as 'Name of track purchased', i.UnitPrice as '$ Amount for Track', c.FirstName || ' ' || c.LastName as 'Customer Name'
FROM Track as t
FULL JOIN InvoiceLine as i
    ON t.TrackId = i.InvoiceLineId
FULL JOIN Invoice as i_n
    ON i.InvoiceLineId = i_n.InvoiceId
FULL JOIN Customer as c
    ON i_n.InvoiceId = c.CustomerId;