2012-07-07 66 views
0

我想知道如何創建視圖,即使外鍵爲NULL也可以。例如,我們有表其中有一個主鍵和兩個外鍵:MySQL查看外鍵可以爲NULL的位置

  • IdPerson
  • FkName
  • FkSurname

外國鍵可以爲NULL。現在,我們也有兩個表,表名稱

  • IdName
  • 名稱

而且表

  • IdSurname

現在我們創建視圖爲每個人物顯示姓名:

CREATE VIEW `Database`.`ViewPerson` AS 
SELECT `N`.`Name`, `S`.`Surname` 
FROM `Person` `P`, `Name` `N`, `Surname` `S` 
WHERE (`P`.`FkName` = `N`.`IdName`) AND (`P`.`FkSurname` = `S`.`IdSurname`) 

的問題是,如果外鍵FkSurname爲NULL,比即使FkName被定義該行不會被顯示。我希望即使兩個外鍵都是NULL,它仍然會返回兩列都爲NULL的行。現在我知道我可以通過在表名和表Surname行中添加名稱/姓名下的NULL,然後在FkName和FkSurname引用中在這兩列下具有NULL值的行來解決此問題。但是我仍然想知道是否有一個解決方案,其中外鍵是NULL並且該行被返回。

+0

你應該看看左加入 http://www.w3schools.com/sql/sql_join_left.asp – sergiofbsilva 2012-07-07 17:21:44

回答

3

如果我正確理解您的問題,您希望爲Person表中的每個記錄的Name和Surname表中的Name和Surname字段獲取相應的值(即使爲null)。

這似乎是一個簡單的情況下,左加入將正常工作。因此,基於上述查詢,在SQL是:

CREATE VIEW Database.ViewPerson AS 
SELECT 
    N.Name, S.Surname 
FROM Person P 
    LEFT JOIN Name N ON N.IdName = P.FkName 
    LEFT JOIN Surname S ON N.IdSurname = S.FkSurname; 

(遺憾的語法是不是100%正確,我沒有去通過,並創建一個測試表進行確認)

+0

謝謝。這是正確的答案。 – 2012-07-08 15:07:41

+0

@JernejJerin:但是顯示一個Name和Surname爲null的行真的有意義嗎?我認爲你還應該添加一個條件,至少有一個連接匹配。類似'WHERE NOT(N.IdName IS NULL AND S.IdSurname IS NULL)'。 – 2012-07-09 06:46:49

+0

是的,我確實需要兩個NULL值。不管怎麼說,還是要謝謝你! – 2012-07-09 12:39:21