【问题标题】:How can you LEFT JOIN a table to a table being joined ON a sub-select?你怎么能将一个表左连接到一个在子选择上连接的表?
【发布时间】:2021-04-28 14:12:41
【问题描述】:

我正在使用以下查询将表连接在一起,它似乎可以正常工作,尽管我不太明白为什么:

    SELECT
        listing.name,
        biggestLot.price,
    FROM Listings listing
    LEFT JOIN Lots biggestLot ON biggestLot.lotNumber = (
            SELECT lotNumber
            FROM Lots
            WHERE lotNumber IN
                (
                    SELECT lotNumber
                    FROM Listings listingInner
                    WHERE listingInner.listingNumber = listing.listingNumber
                )
            ORDER BY size DESC
            LIMIT 1
    )
    GROUP BY listing.listingNumber

上下文是每个“Listing”通过“lotNumber”字段与一个或多个“Lots”相关联。表格未标准化;即对于任何给定的Listing,“Listings”表中可能有一行或多行,除了“lotNumber”之外的所有字段都有重复的值。上述查询的目的是查找与每个列表关联的最大手数的价格。

内部SELECT 获得给定Listing 的最大Lot,我了解它是如何工作的。我不明白LEFT JOIN 如何将biggestLot 结果与外部SELECT 列表查询合并。我没有指定 ON 字段来组合这两个表,那么它怎么知道如何组合结果?

【问题讨论】:

  • 子查询与WHERE listingInner.listingNumber = listing.listingNumber相关
  • 在没有任何聚合函数的情况下,GROUP BY 子句永远不合适。如需进一步帮助,请参阅Why should I provide an MCRE for what seems to me to be a very simple SQL query
  • 不清楚你不明白什么。左连接和内连接的工作方式是常见问题解答。 ON 不会“组合”行。连接执行交叉连接,然后保留满足 on/using 的结果行,然后左/右/完全连接通过 UNION ALL 添加任何由空值扩展的不匹配的右/左/两个表行。选择返回一个表,找出标量子查询是什么。编写一个最小查询,显示您不理解的内容(显然不需要与您的应用程序有任何关系)并提供minimal reproducible example,其中包括您如何阅读权威文档。说出您的期望和原因。
  • 好的,感谢大家的帮助。我想我现在只是在我的头上。

标签: mysql sql left-join


【解决方案1】:

您可以将窗口函数与JOIN 一起使用:

SELECT l.name, lo.price,
FROM Listings l LEFT JOIN
     (SELECT lo.*,
             ROW_NUMBER() OVER (PARITION BY lo.lotNumber ORDER BY lo.size DESC) as seqnum
      FROM Lots lo
     ) lo
     USING (lotNmber);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2018-03-30
    • 2014-02-03
    • 2011-05-17
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    相关资源
    最近更新 更多