【发布时间】: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,其中包括您如何阅读权威文档。说出您的期望和原因。
-
好的,感谢大家的帮助。我想我现在只是在我的头上。