我已经实现了所需的查询,但是我想知道这个查询是如何工作的。我的数据库中有多个表,我的要求是从名为 product 的表中提取id
,并使用此id
,我想从多个表中检索一些数据,然后< strong>产品ID 是其他表的foreign key
。下面的查询工作正常(顺便说一句,我刚刚尝试并幸运地得到了该查询)。
SELECT ponsfdp.*, product.pName, product.pImage, product.productSizes FROM product
INNER JOIN priceOnSizesForDigitalPrinting AS ponsfdp ON ponsfdp.pId_fk =
(SELECT pId FROM product WHERE pName LIKE "%booklet%")
WHERE pName LIKE "%booklet%";
但是当我尝试此查询时,
SELECT ponsfdp.*, product.pName, product.pImage, product.productSizes FROM product
INNER JOIN priceOnSizesForDigitalPrinting AS ponsfdp ON ponsfdp.pId_fk =
(SELECT pId FROM product WHERE pName LIKE "%booklet%");
它甚至包含空字段也包含所有数据。有人可以向我解释它是如何工作的吗?我个人认为这两个查询都应返回相同的数据,因为在第二个查询中,我使用的是子查询,并且它仅返回一个id
,另一方面,第一个查询具有 WHERE 子句,它会通过名称的帮助生成相同的id
。第一个查询如何返回非常特定的列,第二个查询也如何返回所有列甚至空列?我需要对两个查询进行解释。
答案 0 :(得分:1)
您的第一个查询还会返回第二个查询返回的所有行。但是,当您添加最后一个过滤器时-
WHERE pName LIKE "%booklet%"
pName就像'booklet'一样,仅保留所有行中的一行。您可以将第二个查询的输出视为一个表,并且逻辑按以下方式工作-
SELECT * FROM (
SELECT ponsfdp.*, product.pName, product.pImage, product.productSizes
FROM product
INNER JOIN priceOnSizesForDigitalPrinting AS ponsfdp
ON ponsfdp.pId_fk = (SELECT pId FROM product WHERE pName LIKE "%booklet%")
)A
WHERE pName LIKE "%booklet%"
希望这至少会使您对查询有一些了解。
答案 1 :(得分:0)
我在这里看不到需要任何子查询。您应该使用where条件从FROM表中选择行,然后使用联接的ON子句在FROM表的每行的联接表中找到正确的记录:
SELECT ponsfdp.*, product.pName, product.pImage, product.productSizes
FROM product
INNER JOIN priceOnSizesForDigitalPrinting AS ponsfdp
ON ponsfdp.pId_fk = pId
WHERE pName LIKE "%booklet%";