【问题标题】:Solve the query using join?使用join解决查询?
【发布时间】:2016-02-29 16:17:16
【问题描述】:

我有一个表 session1,只需要查找使用特定 ID 登录的新条目。

create table session1(name varchar(16),id integer);

insert into session1 values('anshu',20);
insert into session1 values('rohit',21);
insert into session1 values('anshu',21);
insert into session1 values('sonu',21);
insert into session1 values('payal',22);
insert into session1 values('anshu',22);
insert into session1 values('roch',22);
commit;

所有使用 id 21 登录的新用户的不加入查询将如下所示:

select name from session1 where name NOT IN(Select name from session1 where id<>21);

输出将是:

rohit
sonu

谁能告诉我如何使用连接解决它?

【问题讨论】:

  • 你为什么需要另一个查询?顺便说一句,不要标记不涉及的产品,Oracle 或 SQL Server?
  • 面试官问这个问题是为了解决这个问题。
  • 为什么在这里使用连接?只有一张桌子。
  • @ThanosMarkou 只有 1 个表,但它被使用了两次 - 查找使用 id 21 登录并且没有使用任何其他 id 登录的人。也许可以使用外连接?
  • 显然面试官希望你显示一个 ANTI JOIN 查询,如你得到的答案所示。这是一种有时在 DBMS 上使用的模式,在 NOT IN 和 NOT EXISTS 上非常慢。在 Oracle 或 SQL Server 中,您不需要这个。询问如何用一个简单的having子句来解决这个问题会是一个更合适的问题。

标签: sql oracle sql-server-2008


【解决方案1】:

你只有一张桌子,所以没有什么可以加入的。

在您当前的查询中,您无需使用子查询。您的查询应该是:

select name from session1 where id <>21

要查找 “我有一个表 session1,只需要查找使用特定 id 登录的新条目。”您可以使用此查询:

select name from session1 where id in (20,21) 

【讨论】:

  • 对不起,如果我错了,但您不需要“IN (21)”吗?正如 OP 要求的“NOT IN ( 21)”...?
  • 使用连接解决?好的,这就去。 select name from session1 a inner join session1 b on a.id=b.id and b.id'21'
  • 两个查询都返回 4 行,即与 OP 的查询结果不同。
  • 如果您使用 IN(21, 22,23) 中的多个值,则只需要 IN (21) ,如果您只寻找一个,则可以使用 =21 或 21 ,取决于你需要什么
【解决方案2】:

试试这个

select a.name 
from session1 a 
    left join session1 b 
    on a.name=b.name 
         and b.id =21 
where b.name is null 

【讨论】:

  • 应该是 IS NULL 而不是 = NULL。如果更正,则返回 payal 和 roch。
【解决方案3】:

你不需要do join,如果面试官告诉你做傻事来证明你适合这份工作,你应该再找一份工作。

你的查询也是错误的

这里你有双重否定,所以这个:

SELECT NAME
FROM session1
WHERE NAME NOT IN (
        SELECT NAME
        FROM session1
        WHERE id <> 21
        );

相当于

SELECT NAME
FROM session1
WHERE id = 21;

两者都不会产生您的问题输出

【讨论】:

    【解决方案4】:

    如果我正确理解你的意思,你可以这样做:

    SELECT S1.name FROM session1 S1 LEFT OUTER JOIN
    (SELECT name, id FROM session1 WHERE id = 21) S2
    ON S1.id = S2.id
    WHERE S2.Id IS NOT NULL
    

    【讨论】:

    • 没有 s2.id,因为您没有在子查询中选择该列。
    • @jarlh 正确,已修复。
    【解决方案5】:
    select s1.name
    from session1 s1
      left join session1 s2 on s1.name = s2.name and s1.id <> s2.id
    where s1.id = 21
      and s2.id is null
    

    执行为:

    SQL>select *
    SQL&from session1 s1
    SQL&  left join session1 s2 on s1.name = s2.name and s1.id <> s2.id
    SQL&where s1.id = 21
    SQL&  and s2.id is null;
    name                      id name                      id
    ================ =========== ================ ===========
    rohit                     21 -                          -
    sonu                      21 -                          -
    
                      2 rows found
    

    【讨论】:

      猜你喜欢
      • 2015-10-13
      • 2014-04-04
      • 1970-01-01
      • 2022-01-17
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      相关资源
      最近更新 更多