2012-07-07 69 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