【发布时间】: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