当前位置:  开发笔记 > 数据库 > 正文

SQL - SELECT子句中的递归条件

如何解决《SQL-SELECT子句中的递归条件》经验,为你挑选了1个好方法。

我不是SQL中最好的,所以对不起,如果我问愚蠢的问题:)

我们有一个这样的表:

|id|  name  |  nickname  |
|==|========|============|
| 1|      Jo|      Banana|
| 2|Margaret|The Princess|
| 3|   Perry|  The Monkey|
| 4|Margaret|   The Queen|
| 5|        |     The Rat|
| 6|        |     The Cat|

哪里nickname总是独一无二的.

而我正试图得到这样的结果:

|id|  name  |  nickname  |     display_name      |
|==|========|============|=======================|
| 1|      Jo|      Banana|                     Jo|
| 2|Margaret|The Princess|Margaret (The Princess)
| 3|   Perry|  The Monkey|                  Perry|
| 4|Margaret|   The Queen|   Margaret (The Queen)|
| 5|        |     The Rat|                The Rat|
| 6|        |     The Cat|                The Cat|

基本上逻辑是:

    如果name空的那么display_name = 'nickname'

    如果name独一无二的display_name = 'name'

    如果namenot_unique那么display_name = 'name (nickname)'

我只能使用一个SQL查询来实现它吗?如果是这样 - 怎么样?如果不是 - 有哪些替代方案?

目前我使用我的编程语言,但我必须为结果的每一行发送另一个SQL查询,以检查是否有其他记录具有相同的名称,对于过滤结果是可以的,但在检索整个表时太贪心(4 000行和增长).



1> John Bolling..:

您可以使用窗口函数版本COUNT()来确定name给定行是否唯一,而不执行子查询.例如:

SELECT
  id, name, nickname,
  CASE
    WHEN ISNULL(name, '') = '' THEN nickname
    WHEN (COUNT(*) OVER (PARTITION BY name)) = 1 THEN name
    ELSE name + ' (' + nickname + ')'
  END AS display_name
FROM my_table

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有