如何使用sql从'in'语句中指定两列?

时间:2017-04-14 00:28:16

标签: sql sqlplus

我有一个我想写的查询:

select busnumber from bus where busnumber in 
(select frombusnumber, tobusnumber from transformer where transformernumber = 1 or transformernumber = 1);

然而,“从变压器中选择frombusnumber,tobusnumber”给了我一些问题。我知道我可以用OR语句写两次并指定每一列:

select busnumber from bus where busnumber in
(select frombusnumber from transformer where tobusnumber = 1 or frombusnumber = 1)
or busnumber in (select tobusnumber from transformer where frombusnumber = 1 or tobusnumber = 1);

但是我想知道在我需要将大量列结果合并在一起的情况下,这是否是完成此任务的唯一方法,以避免大量的OR语句。

4 个答案:

答案 0 :(得分:0)

您可以使用 union 运算符组合两个或多个SELECT语句的结果集。例如:

从总线所在的公交车中选择公交号码 (  从变压器中选择frombusnumber,其中frombusnumber = 1  的联合  从变压器中选择tobusnumber,其中tobusnumber = 1 )

答案 1 :(得分:0)

我认为最有效的方法可能是:

select b.busnumber
from bus b
where b.busnumber = 1 or
      b.busnumber in (select t.frombusnumber from transformer t where t.tobusnumber = 1) or
      b.busnumber in (select t.tobusnumber from transformer t where t.frombusnumber = 1);

答案 2 :(得分:0)

请尝试以下方法......

SELECT busnumber
FROM busnumber
WHERE busnumber IN ( SELECT frombusnumber
                     FROM transformer
                     WHERE transformernumber = 1
                     UNION
                     SELECT tobusnumber
                     FROM transformer
                     WHERE transformernumber = 1 );

使用IN语句,您需要将单个字段与公交号码列表WHERE transformernumber = 1进行比较。因此,列表应该是一列总线编号。

只需使用frombusnumber运算符将tobusnumber列表加入UNION列表,即可形成此列表。这称为垂直连接 - 更为熟悉的JOINLEFT JOIN等是水平连接的类型。

如果您有任何问题或意见,请随时发表评论。

进一步阅读

https://dev.mysql.com/doc/refman/5.7/en/union.html

https://www.w3schools.com/sql/sql_union.asp

答案 3 :(得分:0)

您似乎对“busnumber”感兴趣,您可以直接在“变压器”表中找到它。 我们可以使用以下查询获得结果。

Select distinct(case
when tobusnumber = 1 then frombusnumber
when frombusnumber = 1 then tobusnumber
end )as busnum
from transformer  where tobusnumber = 1 or frombusnumber = 1;

如果删除where子句,则会获得空值。 您应该提供表格结构以便更好地理解。