Sql 这是带有联接的有效关联子查询吗?
所以我有一个表CarCar\u id,Value,Make,另一个表PersonPerson\u id,Name和第三个表将这两个表链接在一起PerCarCar\u id,Person\u id 我有一个相关的子查询:Sql 这是带有联接的有效关联子查询吗?,sql,postgresql,correlated-subquery,Sql,Postgresql,Correlated Subquery,所以我有一个表CarCar\u id,Value,Make,另一个表PersonPerson\u id,Name和第三个表将这两个表链接在一起PerCarCar\u id,Person\u id 我有一个相关的子查询: SELECT MAKE, VALUE FROM CAR WHERE VALUE > (SELECT AVG(VALUE) FROM CAR C WHERE C.CAR_ID = CAR_ID); SELECT MAKE, VALUE FROM CAR WHERE VA
SELECT MAKE, VALUE
FROM CAR WHERE VALUE > (SELECT AVG(VALUE) FROM CAR C WHERE C.CAR_ID = CAR_ID);
SELECT MAKE, VALUE
FROM CAR
WHERE VALUE > (SELECT AVG(VALUE) FROM CAR C WHERE C.CAR_ID = CAR_ID);
因此,如果我还想显示此人的姓名,那么这是否也是有效的关联子查询:
SELECT Car.Make, Car.Value, Person.Name
FROM PerCar NATURAL JOIN Car
NATURAL JOIN Person where Car.Value > (SELECT AVG(VALUE) FROM Car);
您的查询应如下所示- 你可以查一下
请记住,根据您的需求和数据结构,这里的联接可以是内部联接、外部联接、左侧联接或其他联接。这不是一个相关的子查询:
SELECT MAKE, VALUE
FROM CAR WHERE VALUE > (SELECT AVG(VALUE) FROM CAR C WHERE C.CAR_ID = CAR_ID);
SELECT MAKE, VALUE
FROM CAR
WHERE VALUE > (SELECT AVG(VALUE) FROM CAR C WHERE C.CAR_ID = CAR_ID);
始终限定查询中的所有列引用
您认为WHERE子句是:
WHERE CAR.VALUE > (SELECT AVG(VALUE) FROM CAR C WHERE C.CAR_ID = CAR.CAR_ID);
但事实上:
WHERE CAR.VALUE > (SELECT AVG(C.VALUE) FROM CAR C WHERE C.CAR_ID = C.CAR_ID);
没有对外部查询的引用,因此这是不相关的。我将这样写:
SELECT C.MAKE, C.VALUE
FROM CAR C
WHERE C.VALUE > (SELECT AVG(C2.VALUE) FROM CAR C2 WHERE C2.CAR_ID = C2.CAR_ID);
但是,这不太可能返回任何行。考虑到您缺少问题陈述和表中的值,合理的查询将返回其值高于其制造平均值的所有汽车
SELECT C.MAKE, C.VALUE
FROM CAR C
WHERE C.VALUE > (SELECT AVG(C2.VALUE) FROM CAR C2 WHERE C2.MAKE = C.MAKE);
因为您的问题的其余部分是基于第一个查询是相关子查询的前提,所以问题的其余部分没有意义。您好,谢谢您的帮助,我得到了一个名为percar\u id,Person\u id的额外表,它将Car表和Person表链接在一起。所以我可以不做3个连接,一个像汽车内部连接PerCar内部连接PerCar内部连接PerCar内部连接PerCar内部连接Person``?这仍然是一个相关子查询吗?这仍然是一个有效的相关子查询吗?是的,这是有效的。非常感谢,我在中被告知:相关查询不能有连接。嗯,没有相关子查询,它是一个标量子查询。你的两个查询返回不同的结果,1是一个相关子查询,返回的行的值大于相关CAR_ID的平均值,但2返回的行的值大于所有CAR的平均值,它不是相关的,它是ScalarIn事实上,您的第一个选择不是相关子查询,因为内外表之间没有相关性,其中C.CAR\u ID=CAR\u ID与1=1相同,应该来自C车,其中VALUE>从C车中选择AVGVALUE,其中C.CAR\u ID=C2.CAR\u避免像瘟疫一样的自然连接。@主持人:在确认为“穿刺者”的同时,特意告诉某人避免一种罕见且易于治疗的疾病-您目前正在采取哪些步骤来避免实际的瘟疫?有一天,当我猜C2.CAR\u ID=C2.CAR\u ID应该是C2.CAR\u ID=C.CAR\u ID时,你所说的“列引用”实际上是范围变量,代表行,即错误的思维方式。注意,使用自然连接不需要范围变量,例如OP的第二个查询可以写为SELECT Make、Value、Name。。。价值何在?i、 删除多余的范围变量。@onedaywhen。自然联接是一种讨厌的方式,因为它没有考虑正确声明的外键关系。@GordonLinoff:在我之后重复:包含联接的SQL DML在设计上不依赖包含fks的SQL DDL。