首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL:复杂查询的问题

SQL:复杂查询的问题
EN

Stack Overflow用户
提问于 2010-12-12 05:05:55
回答 3查看 136关注 0票数 1

或者至少它对我来说很复杂,因为我对SQL完全是个新手。

我想为我的MySQL-ODBC电话簿程序编写一个查询,它返回一个人的某些详细信息和他的主要电话号码(如果有)。

person和number存储在不同的表(person和numbers)中,而它们的关系存储在npr (number-person relations)表中。

'persons‘的主键是'nick','numbers’的主键是'number','npr‘的主键是'persons_nick’和'numbers_number‘。

如果一个数字是主要的,它是由npr表的type属性中的单词" primary“表示的。(我知道它很原始,但我认为我不需要这个属性,现在我没有时间正确地实现它)

下面是现在的代码:

代码语言:javascript
复制
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;

当然,如果此人没有主电话号码,则不会返回任何内容。在这种情况下,我如何重写此查询以返回人员的属性和无效数字?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-12 06:14:51

您的问题的解决方案是将LIKE约束移动到左连接的谓词中:

代码语言:javascript
复制
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仅用于persons和numbers之间的标记关联。所以如果你只使用左连接,那么你可以确定,你得到了所有的人,无论他们是否有一个主要的号码。

票数 2
EN

Stack Overflow用户

发布于 2010-12-12 05:19:14

在这种情况下,您可以使用IsNullCoalesce

票数 0
EN

Stack Overflow用户

发布于 2010-12-12 05:21:13

这是由where子句引起的,因为没有匹配的类型,它将被过滤掉。你可能可以通过这样做来修复它。

代码语言:javascript
复制
WHERE npr.type is null or npr.type LIKE '%primary%' 

或者,如果表中的npr.type也可以为null,您可以这样做

代码语言:javascript
复制
WHERE npr.persons_nick is null or npr.type LIKE '%primary%' 

因为它不会有npr,所以链接值应该是null,也要在NPR上做一个左连接(不确定这是否重要,我自己从来不使用右连接)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4418948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档