2017-03-07 62 views
1

我有一張表包含3列:年齡,姓名,暱稱 我只想得到姓名(+年齡),其中姓名+年齡根本不存在在暱稱+年齡。提高查詢速度:簡單SELECT從SELECT表中選擇巨大的表

例如:如果表:DETAILS包含2行:

  1. 年齡:5,名:蘇子,暱稱:蘇子
  2. 年齡:2,名稱:吉爾,暱稱:克

查詢將返回:年齡:2名:吉

SELECT d1.AGE, d1.NAME 
FROM DETAILS d1 
WHERE d1.NAME NOT IN (SELECT d2.NICKNAME FROM DETAILS d2 WHERE d2.AGE = d1.AGE) 

這個查詢只能運行在小數據。 任何想法如何改善它?

+1

LEFT JOIN而不是NOT IN。 – jarlh

回答

1

在SQL查詢性能的關鍵點是使用索引。所以你必須在查詢/連接列中有索引,並且你需要使用它(通過連接)。

E.g.查詢:

SELECT DISTINCT D1.AGE, D1.NAME 
FROM DETAILS D1 LEFT JOIN DETAILS D2 ON D1.AGE = D2.AGE 
WHERE D1.NAME <> D2.NICKNAME 

請注意,您必須事先在列AGE,NAME和NICKNAME上創建索引才能充分受益於此查詢。

+0

索引解決了這個問題 – userit1985

0

您可以輕鬆地得到這個結果:

SELECT d1.AGE, 
     CASE WHEN d1.NAME IS NULL 
      THEN d1.NIKCNAME ELSE d1.NAME END as [NewName] 
FROM DETAILS d1 
INNER JOIN DETAILS d2 
    ON d1.AGE = d2.AGE 
WHERE d2.NAME <> d1.NICKNAME 
+0

該查詢將返回名稱與同一行*中的暱稱*不同的所有行,這不是OP所要求的。他們希望所有行的名稱/年齡不顯示爲表中任何*行的暱稱/年齡*。 –

0

使用左連接/左外連接,而不是WHERE ... NOT IN ...

的SQL

的執行順序
  1. FROM
  2. ON
  3. OUTER
  4. 其中
  5. GROUP BY
  6. CUBE | ROLLUP
  7. HAVING
  8. 選擇
  9. DISTINCT
  10. ORDER BY
  11. TOP