SQL-使用多个条件而不是连接和子查询

时间:2017-09-17 13:46:50

标签: mysql sql-server

我是编程和SQL的新手,只是想知道使用join / subquery而不是多个条件是否存在不成文的规则,原因或缺点。像这样:

select column
from table1
where table1.A=table2.B and
table2.C=table3.D and
table3.E=table4.F;

可以在工作环境中使用它吗?

1 个答案:

答案 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列(即subscriptionIDSELECT),这是在表中共享,并打算在这些类型的关系查询中用作外键。

底线:

您不能像在示例中那样简单地引用查询中的多个表,而不以某种方式将它们连接在一起。

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; } ......等)。

干杯,
- =卡梅伦