【问题标题】:Joining 4 tables is leaving out a lot of rows, can't figure out why加入 4 个表会遗漏很多行,不知道为什么
【发布时间】:2020-10-17 08:58:11
【问题描述】:

我正在使用 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;

【问题讨论】:

  • 这个连接谓词在我看来有点可疑 - ON i_n.InvoiceId = c.CustomerId;Invoice 表中是否有 CustomerID 列,如果有,那么您可能应该加入该列而不是 @ 987654327@
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。
  • 您可能需要像il.tid=t.tidil.iid=i.iidi.cid=c.cid 这样的测试。在给出业务关系(船舶)/关联或表(基础或查询结果)时,说明其中的一行根据其列值说明了业务情况。

标签: sql sqlite join


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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;
    

    【讨论】:

    • SQLite 不支持 FULL join。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多