【问题标题】:How to SELECT record from a table where column is equal to a value but shouldn't be equal to another value?如何从列等于一个值但不应等于另一个值的表中选择记录?
【发布时间】:2021-07-29 11:23:28
【问题描述】:

对于给定的问题,我列出了两种不同的解决方案。有没有更好的方法来解决这些类型的问题?

问:给定下面的员工表,选择 id = 1 但不 = 3 的名称

-- ID   NAME
-- 1    ram
-- 2    shayam
-- 1    mohan
-- 7    mohan
-- 4    monu
-- 3    monu
-- 1    monu
-- 5    sonu
-- 1    sonu
-- 2    sonu


-- OUTPUT
-- mohan
-- ram
-- sonu

-- Solution 1:
SELECT DISTINCT(e1.NAME) FROM EMPLOYEE e1 JOIN EMPLOYEE e2 ON e1.name = e2.name WHERE e1.id = 1 AND e1.NAME NOT IN (
SELECT DISTINCT(e1.NAME) FROM EMPLOYEE e1 JOIN EMPLOYEE e2 ON e1.name = e2.name WHERE  e2.id = 3);

-- Solution 2:
SELECT DISTINCT(e1.NAME) FROM EMPLOYEE e1 JOIN EMPLOYEE e2 ON e1.name = e2.name WHERE e1.id = 1 
MINUS
SELECT DISTINCT(e1.NAME) FROM EMPLOYEE e1 JOIN EMPLOYEE e2 ON e1.name = e2.name WHERE  e2.id = 3;

-- Use this code to test the logic:
CREATE TABLE EMPLOYEE( id INT, name VARCHAR(25) ); 
INSERT INTO EMPLOYEE(id, name) VALUES(1, 'ram'); 
INSERT INTO EMPLOYEE(id, name) VALUES(2, 'shayam'); 
INSERT INTO EMPLOYEE(id, name) VALUES(1, 'mohan'); 
INSERT INTO EMPLOYEE(id, name) VALUES(7, 'mohan'); 
INSERT INTO EMPLOYEE(id, name) VALUES(4, 'monu'); 
INSERT INTO EMPLOYEE(id, name) VALUES(3, 'monu'); 
INSERT INTO EMPLOYEE(id, name) VALUES(1, 'monu'); 
INSERT INTO EMPLOYEE(id, name) VALUES(5, 'sonu'); 
INSERT INTO EMPLOYEE(id, name) VALUES(1, 'sonu');
INSERT INTO EMPLOYEE(id, name) VALUES(2, 'sonu');

SELECT * FROM EMPLOYEE;

【问题讨论】:

  • minus 很好。但是,该 set 函数是依赖于数据库的。
  • 与您的问题无关,但是:distinct 不是一个函数。它始终适用于选择列表中的所有列。用括号括住其中一列不会改变任何东西并且是无用的。 distinct (a),b 与 distinct a,(b) 或 distinct a,b 相同
  • 您的架构似乎已损坏。如果这是一个员工列表,那么 id 列应该是唯一的。如果它是另一个将员工与其他实体相关联的表,例如他们所拥有的技能或他们工作的部门,那么该表应该这样命名并且id 列应该是skill_id 或类似的,并且应该有一个单独的员工表。
  • 谢谢,@MatBailie,但请不要详细介绍,我已尝试提供一个虚拟表来了解我要解决的问题类型。
  • 这是另一个使用子查询的解决方案SELECT name FROM EMPLOYEE WHERE id = 1 and name NOT IN( SELECT name FROM EMPLOYEE WHERE id = 3 )

标签: sql database question-answering


【解决方案1】:

minus 很好,但您不需要select distinct。 Minus 是一个只返回不同行的集合函数。我倾向于为此使用聚合:

select e.name
from employee e
where id in (1, 3)
group by e.name
having max(id) = 1;   -- there is no 3 if the max is 1

但是,您的方法基本上没问题,尽管我要重申select distincts 不是必需的。

【讨论】:

    猜你喜欢
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多