Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 这是带有联接的有效关联子查询吗?_Sql_Postgresql_Correlated Subquery - Fatal编程技术网

Sql 这是带有联接的有效关联子查询吗?

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

所以我有一个表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 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。