或者至少对我来说这很复杂,因为我是SQL的总菜鸟。
我想为我的MySQL-ODBC电话簿程序写一个查询,该程序返回一个人的某些细节和他的主要电话号码(如果有的话)。
人和数字存储在不同的表格(人和数字)中,而他们的关系在npr(数字 - 人际关系)表中。
'人'的主要关键是'缺口','数字'是'数字','npr'是'people_nick'和'numbers_number'在一起。
如果一个数字是主数字,则通过npr表的type属性中的某个单词“primary”发出信号。 (我知道它是原始的,但我认为我不需要这个属性,现在我没有时间正确实现它)
以下是现在的代码:
SELECT persons.nick AS nick, persons.fullname AS fullname,
persons.prefix AS prefix, persons.surname AS surname,
persons.forename AS forename, persons.photo AS photo,
numbers.prettynumber AS primarynumber
FROM persons
RIGHT JOIN npr ON npr.persons_nick=persons.nick
LEFT JOIN numbers ON npr.numbers_number=numbers.number
WHERE npr.type LIKE '%primary%'
ORDER BY nick;
如果此人没有主要电话号码,这当然不会返回任何内容。在这种情况下,如何重写此查询以返回此人的属性和空值?
谢谢。
答案 0 :(得分:2)
您的问题的解决方案是将LIKE约束移动到左连接的谓词中:
SELECT persons.nick AS nick, persons.fullname AS fullname,
persons.prefix AS prefix, persons.surname AS surname,
persons.forename AS forename, persons.photo AS photo,
numbers.prettynumber AS primarynumber
FROM persons
RIGHT JOIN npr ON npr.persons_nick=persons.nick
LEFT JOIN numbers ON npr.numbers_number=numbers.number
and
npr.type LIKE '%primary%'
ORDER BY nick;
WHERE谓词过滤所有记录,但连接谓词仅属于此左连接。如果右侧不匹配,那么您仍然可以获得连接的左侧。
<强>更新强> 在我看来,在这种情况下仅使用左连接会更好。我不知道确切的表定义,但我认为表npr仅用于人和数字之间的标记关联。因此,如果您只使用左连接,那么您可以确定,无论是否有主要号码,您都可以获得所有人。
答案 1 :(得分:0)
在这种情况下,您可以使用IsNull
或Coalesce
。
答案 2 :(得分:0)
这是由你的where子句引起的,因为没有匹配的类型会被过滤掉。您可以通过执行类似
之类的操作来修复它WHERE npr.type is null or npr.type LIKE '%primary%'
或者如果表中的npr.type也可以为null,则可以执行
WHERE npr.persons_nick is null or npr.type LIKE '%primary%'
因为它没有npr,链接的值应该为null,也可以在NPR上进行左连接(不确定是否重要但是我从不使用右连接)