2013-05-30 64 views
0

我有一個很好的查詢:都不能返回null,所以我需要替換

SELECT DISTINCT(p.id), 
       p.last_name, 
       p.first_name, 
       c.club_name, 
       c.join_date, 
       e.Full_name 
FROM people AS p, 
     club AS c, 
     employee AS e 
WHERE c.people_id = p.id 
     AND p.id_ofproducer = e.id 
     AND size IN ('Large', 'Medium') 

它幾乎做什麼,我希望它做的事。希望改變這一點,以便我獲得所有規模爲中或大的記錄,而不管俱樂部(c)或EM員工(e)相關記錄在哪裏。

AND:如果它們爲NULL,我真的很想c.club_name,c.join_date和or.full_name返回爲「 - 」。

所以我的問題是兩倍。

  1. 哪些錯誤與我的SQL /加入
  2. 是否有可能代替空的返回一個字符串?
+0

不適合您的問題,但在此查詢中使用'DISTINCT'既昂貴又無效。 –

回答

2

答1:您的加入是INNER JOIN這意味着它必須是兩個表中,你需要切換到LEFT JOIN
答案2:是的,使用IFNULL(c.club_name,'--')COALESCE(c.club_name,'--')

SELECT DISTINCT(p.id), 
       p.last_name, 
       p.first_name, 
       IFNULL(c.club_name,'--') AS club_name, 
       IFNULL(c.join_date,'--') AS join_date, 
       IFNULL(e.Full_name,'--') AS Full_name 
FROM people AS p, 
     LEFT JOIN club AS c ON c.people_id = p.id 
     LEFT JOIN employee AS e ON p.id_ofproducer = e.id 
WHERE size IN ('Large', 'Medium') 
0

使用離開連接和ifnull()

SELECT DISTINCT p.id, 
     p.last_name, 
     p.first_name, 
     ifnull(c.club_name, '--') club_name, 
     ifnull(c.join_date, '--') join_date, 
     ifnull(e.Full_name, '--') Full_name 
FROM people p 
LEFT JOIN 0club c c.people_id = p.id 
LEFT JOIN employee e ON p.id_ofproducer = e.id 
WHERE size IN ('Large', 'Medium') 
1

的問題與您加入的是,它是一個INNER加入,你需要一個LEFT加入。另外,最好使用ANSI連接語法,而不是在WHERE子句中掩蓋連接條件。

至於將NULL轉換爲字符串,請使用MySQL Coalesce function

新的查詢會是這個樣子:

SELECT DISTINCT(p.id), 
      p.last_name, 
      p.first_name, 
      COALESCE(c.club_name, '---'), 
      COALESCE(c.join_date, '---'), 
      COALESCE(e.Full_name, '---') 
FROM people AS p 
LEFT JOIN club c ON p.id = c.people_id 
LEFT JOIN employee e ON p.id_ofproducer = e.id 
WHERE size IN ('Large', 'Medium') 

我不太清楚發生了什麼事情與DISTINCT(p.id),但如果不管它做你的作品,然後這一切都很好。

+0

FWIW,兩種連接方式都是ANSI。逗號樣式的語法在SQL-89中,後續版本支持向後兼容。 'JOIN'語法在SQL-92中是最新版本。 –

+0

謝謝比爾 - 我從來不知道這一點。我在這裏和那裏試圖找到ANSI標準究竟是什麼的明確描述,但除了昂貴的ANSI贊助文件外,我已經空了。所以我一直在一起拼湊起來,像這樣的金塊非常有幫助。再次,謝謝! –

+0

一本好書是「SQL-99 Complete,Really」,它已被改編爲一個在線版本:https://kb.askmonty.org/en/sql-99/ –

0
1. Use LEFT OUTER JOIN 
2. Use ifnull() function 

    SELECT DISTINCT(p.id), 
         p.last_name, 
         p.first_name, 
         ifnull(c.club_name, '--') as club_name, 
         ifnull(c.join_date, '--') as join_date, 
         ifnull(e.Full_name, '--') as Full_name 
     FROM people AS p 
     LEFT OUTER JOIN club AS c ON c.people_id = p.id 
     LEFT OUTER JOIN employee AS e ON p.id_ofproducer = e.id 
     WHERE size IN ('Large', 'Medium') 
相關問題