【问题标题】:Replace subquery with join for the same table用连接替换同一张表的子查询
【发布时间】:2019-12-19 11:58:49
【问题描述】:

这种情况下的预期结果可以在没有子查询的情况下完成吗?也许使用连接?

我们有一个名字叫“jose”,预期结果是所有与 jose 颜色相同的行。查询应该在 MS-SQL 和 ORACLE 中运行。

query
======
select name,color from tableA where color=(select color from tableA where name='jose')

Expected result 
===============
name    color
jose    red
Rap     red

schema
=======

Table and DATA
create table tableA (
name varchar(10),
color varchar(10)
);

insert into tableA values ('jose','red');
insert into tableA values ('Mickey','blue');
insert into tableA values ('Leo','yellow');
insert into tableA values ('Rap','red');
insert into tableA values ('Don','blue');

http://sqlfiddle.com/#!18/5f7e3/2

【问题讨论】:

    标签: sql sql-server join subquery


    【解决方案1】:

    您可以通过在color 字段上进行自联接,使用JOIN 获得此结果,其中第二个表中的名称为jose

    SELECT a1.name, a1.color
    FROM tableA a1
    JOIN tableA a2 ON a2.color = a1.color AND a2.name = 'jose'
    

    输出

    name    color
    jose    red
    Rap     red
    

    SQL Server demo on SQLFIddle

    Oracle demo on SQLFiddle

    【讨论】:

    • 谢谢你正是我要找的东西
    • @Raj 不用担心 - 我很高兴能提供帮助。
    【解决方案2】:

    如果名称只有一种颜色,那么您似乎想要:

    select a.*
    from tableA a
    where a.color = (select a2.color from tableA a2 where a2.name = 'jose');
    

    如果您不想返回该行,您可能需要添加另一个条件 a.name <> 'jose'

    【讨论】:

    • 此查询使用子查询,就像有问题的查询一样。我想知道我们是否可以在没有子查询的情况下做到这一点。
    【解决方案3】:

    我认为最好的方法是“CTE”:

         with 
         cte1 as (
              select 1 as RowToJoin,
                     name,
                     color 
              from tableA
         ),
         cte2 as (
              select 1 as RowToJoin,
                     color
                     name
              from tableA 
              where name='jose'
         )
         select c1.name, c1.color
         from cte1 c1
         join cte2 c2 on c2.RowToJoin = c1.RowToJoin
         where c1.name <> c2.name
    

    看起来很难,其实很简单。尝试阅读它。!

    【讨论】:

      猜你喜欢
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2019-04-04
      相关资源
      最近更新 更多