我是编程和SQL的新手,只是想知道使用join / subquery而不是多个条件是否存在不成文的规则,原因或缺点。像这样:
select column
from table1
where table1.A=table2.B and
table2.C=table3.D and
table3.E=table4.F;
可以在工作环境中使用它吗?
答案 0 :(得分:0)
正如其他人所暗示的那样,你在这里想要实现的目标并不十分清楚。很明显,您希望使用4个表中的数据,并根据其他表中的数据从table1中选择数据。
因此,您必须使用JOIN才能跨多个表进行查询,例如:
USE yourDatabaseName;
select t1.someColumn
,t1.someOtherColumn
,t2.someColumn
,t3.someColumn
,t4.someColumn
from table1 t1 JOIN
table2 t2 ON t1.someIDColumn = t2.someIDColumn JOIN
table3 t3 ON t3.someIDColumn = t2.someIDColumn JOIN
table4 t4 ON t4.someIDColumn = t3.someIDColumn WHERE
t1.targetColumn = t2.targetColumn AND
t2.targetColumn = t3.targetColumn AND
t3.targetColumn = t4.targetColumn;
这里,您有SELECT
子句中指定的多个表中的多个字段,以及使用某种特定唯一ID字段将JOIN
子句连接在一起的targetColumn
子句。
请注意,在此示例中,someIDColumn
的每个出现可能是不同的列名 - 它们不必相同,但它们必须是相同的数据类型才能进行显式相等比较。
ON
列名称也是如此。对于那些,您需要一个存在于两个表中的列,以进行比较(同样,可以在每个表中以不同方式命名列)。
通常,在JOIN
子句的userID
部分之后指定的列名称将是某种唯一ID列(即subscriptionID
或SELECT
),这是在表中共享,并打算在这些类型的关系查询中用作外键。
底线:
您不能像在示例中那样简单地引用查询中的多个表,而不以某种方式将它们连接在一起。
JOIN
子句中指定的每个列必须属于第一个JOIN
之前命名的表,或者它必须属于t1
子句中指定的其中一个表,在这种情况下,您必须在列名前面加上表名或表名的已建立别名,我在这里用于每个表(t2
,// any_of example
#include <iostream> // std::cout
#include <algorithm> // std::any_of
#include <array> // std::array
int main () {
std::array<int,7> foo = {0,1,-1,3,-3,5,-5};
if ( std::any_of(foo.begin(), foo.end(), [](int i){return i<0;}) )
std::cout << "There are negative elements in the range.\n";
return 0;
}
......等)。
干杯,
- =卡梅伦