我有一張員工表,如下所示:
column_name | column_id |
employee_id | 1 |
first_name | 2 |
last_name | 3 |
department_id | 11 |
Employees 表還有一個外鍵,它參考 Departments 表上的主鍵:
column name | column id |
department_id | 1 |
我的目標是使用 anINTERSECT來顯示所有用作名字和姓氏的員工姓名。(即:如果“Lee”是名字和姓氏,我想具體顯示他的名字)。
我正在顯示部門表,因為我不確定是否JOIN需要 a 才能獲得我想要的結果。
首先,我得到了所有名字和姓氏的完整串列:
SELECT e.first_name, e.last_name
FROM Employees e
INTERSECT
SELECT e2.first_name, e2.last_name
FROM Employees e2;
但我只想要出現在first_name和last_name列中的名稱。
我嘗試了以下方法:
SELECT e.first_name, e.last_name
FROM Employees e
WHERE e.first_name = e.last_name
INTERSECT
SELECT e2.first_name, e2.last_name
FROM Employees e2
WHERE e2.first_name = e2.last_name;
并且沒有選擇任何行。
我也嘗試使用JOIN:
SELECT e.first_name, e.last_name
FROM Employees e
JOIN Departments d ON d.department_id = e.department_id
INTERSECT
SELECT e2.first_name, e2.last_name
FROM Employees e2
JOIN Departments d2 ON d2.department_id = e2.department_id;
這選擇了所有行。
我還想知道是否有辦法在INTERSECT不使用WHERE子句的情況下訪問這些列?
uj5u.com熱心網友回復:
像這樣的東西怎么樣:
-- get intersection of first and last name sets
select distinct first_name as first_and_last_name from employees
intersect
select distinct last_name as first_and_last_name from employees;
或這個:
-- get first names that are also last names
select distinct first_name from employees
where first_name in (select distinct last_name from employees);
department除非您想在結果集中包含該表中的資料或使用它來過濾結果集,否則沒有理由擔心該表。
uj5u.com熱心網友回復:
它有助于逐步建立您的查詢。
我們將從獲取名字和姓氏的名稱串列開始。這就是你INTERSECT進來的地方。
SELECT e.first_name
FROM employees e
INTERSECT
SELECT e.last_name
FROM employees e;
現在,你有了那個清單。接下來,您要顯示名字或姓氏在該串列中的任何員工的員工詳細資訊。將其視為“在哪里(某些標準)顯示員工詳細資訊”。我們將從員工詳細資訊查詢開始,稍后添加條件,其中將包括INTERSECT上面的查詢。
因此,員工詳細資訊的基本查詢將是:
SELECT e.first_name, e.last_name, d.department_id
FROM employees e
INNER JOIN departments d ON d.department_id = e.department_id
WHERE ??? -- we need to plug the first query in here somehow.
然后,把它放在一起...
SELECT e.first_name, e.last_name, d.department_id
FROM employees e
INNER JOIN departments d ON d.department_id = e.department_id
WHERE (
e.first_name IN
( SELECT e.first_name
FROM employees e
INTERSECT
SELECT e.last_name
FROM employees e )
OR e.last_name IN
( SELECT e.first_name
FROM employees e
INTERSECT
SELECT e.last_name
FROM employees e )
)
請注意,我們已經重復了該INTERSECT部分并且重復是不好的,所以我們將使它成為一個公用表運算式(想想“WITH從句”)
WITH names (name) AS
( SELECT e.first_name name
FROM employees e
INTERSECT
SELECT e.last_name name
FROM employees e )
SELECT e.first_name, e.last_name, d.department_id
FROM employees e
INNER JOIN departments d ON d.department_id = e.department_id
WHERE (
e.first_name IN ( SELECT name FROM names )
OR e.last_name IN ( SELECT name FROM names )
)
應該這樣做。
uj5u.com熱心網友回復:
與 EXIST :
SELECT first_name FROM employees e WHERE EXIST (SELECT * FROM employees ee WHERE ee.last_name = e.first_name)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/481646.html
上一篇:OracleSQL選擇日期
