[英]Select statement with inner join
Table A Table B
ID Name ID Name Last_Name
1 John 1 John Depp
2 Henry 2 David Henry
3 Ken
我試圖在具有以下條件的語句中選擇名稱:
TableA
的NAME
能夠與TableB
的NAME
映射,則選擇Last_Name
NAME
是TableA
等於TableB
LAST_NAME
,則從TableA
選擇NAME
TableA
的NAME
無法與TableB
的NAME
或LAST_NAME
映射,則從TableA
選擇NAME
。 我使用的方法:
SELECT * FROM
(SELECT A.ID NO, LAST_NAME REALNAME
FROM TABLEA A
INNER JOIN TABLEB B
ON A.NAME = B.NAME
UNION ALL
SELECT A.ID NO, A.NAME REALNAME
FROM TABLEA A
WHERE EXISTS (SELECT 1 FROM TABLEB B WHERE A.NAME = B.LAST_NAME)
UNION ALL
SELECT A.ID NO, A.NAME REALNAME
FROM TABLEA A
WHERE NOT EXISTS (SELECT 1 FROM TABLEB B WHERE A.NAME = B.NAME OR A.NAME = B.LAST_NAME)
)AS T
問題:是否可以使用簡化查詢來達到條件?
您可以使用CASE使其更具可讀性
SELECT A.ID NO, CASE WHEN A.Name = B.Name THEN B.LAST_NAME
WHEN A.Name = B.LAST_NAME THEN A.NAME
WHEN A.Name = B.Name AND A.Name = B.LAST_NAME THEN A.NAME END AS REALNAME
FROM TABLEA A, TABLEB B
您可以使用內部聯接和外部聯接,而不是使用存在和不存在子查詢,這可能會更好:
select a.id, b.last_name as realname
from tablea a
join tableb b
on a.name = b.name
union all
select distinct a.id, a.name
from tablea a
join tableb b
on a.name = b.last_name
union all
select a.id, a.name
from tablea a
left join tableb b
on a.name = b.name
or a.name = b.last_name
where b.name is null
是的,您可以通過格式化使語句“更清晰”。 如果您避免重復使用相同的表別名,這對於人類讀者來說也更加清楚(這也使EXPLAIN輸出更易於與狀態關聯)。 同樣,如果將小寫用作表別名和列名,並限定所有列引用。 同樣,消除不必要的內聯視圖也將使語句更易於閱讀。
從功能上講,它等效於您的原始聲明,但是“更清晰”
SELECT a.id AS `NO`
, b.last_name AS `REALNAME`
FROM TABLEA a
JOIN TABLEB b
ON a.name = b.name
UNION ALL
SELECT e.id AS `NO`
, e.name AS `REALNAME`
FROM TABLEA e
WHERE EXISTS
(SELECT 1 FROM TABLEB f WHERE f.last_name = e.name)
UNION ALL
SELECT o.id AS `NO`
, o.name AS `REALNAME`
FROM TABLEA o
WHERE NOT EXISTS
(SELECT 1 FROM TABLEB p WHERE o.name IN (p.name,p.last_name))
(我也希望表名使用小寫字母;但是您的系統可以設置為使用區分大小寫的表名。如果表名不那么模棱兩可,也會更清楚。)
最后一個SELECT中的NOT EXISTS
謂詞可以用反聯接模式代替; 對於那些熟悉反連接模式以及能夠將其識別出來的人來說,這是否會“更加清晰”。 對於初學者來說,可能不是,並且“ NOT EXISTS
存在”更為清晰。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.