簡體   English   中英

選擇帶有內部聯接的語句

[英]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

我試圖在具有以下條件的語句中選擇名稱:

  1. 如果TableANAME能夠與TableBNAME映射,則選擇Last_Name
  2. 如果NAMETableA等於TableB LAST_NAME ,則從TableA選擇NAME
  3. 如果TableANAME無法與TableBNAMELAST_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM