【问题标题】:Replace repetitive values with Null in MySQL query response在 MySQL 查询响应中用 Null 替换重复值
【发布时间】:2017-06-20 03:29:44
【问题描述】:

我的 MySQL 服务器数据库中有两个表,它们有一个公共列:

表 1

+---------------------------------+
| columnA       | columnB         |
+---------------------------------+
|  123          |  lorem          |
|  456          |  ipsum          | 
|  456          |  dolor          |
+---------------------------------+

表2

+---------------------------------+
| columnA       | columnC         |
+---------------------------------+
|  123          |  sit            |
|  123          |  amet           | 
|  123          |  consectetur    | 
|  456          |  adipiscing     |
+---------------------------------+

我想获取columnBcolumnC 的所有值,其中columnA123。我正在使用的查询是:

SELECT Table1.columnB, Table2.columnC
FROM Table1
INNER JOIN Table2 ON Table1.columnA = Table2.columnA
WHERE Table1.columnA = '123';

这是查询结果

+---------------------------------+
| columnB       | columnC         |
+---------------------------------+
|  lorem        |  sit            |
|  lorem        |  amet           | 
|  lorem        |  consectetur    | 
+---------------------------------+

我得到了所需的结果,但我不希望像本例中的 columnB 那样重复这些值。有没有办法用NULL 或空格替换(最后两个)冗余值lorem?比如:

+---------------------------------+
| columnB       | columnC         |
+---------------------------------+
|  lorem        |  sit            |
|               |  amet           | 
|               |  consectetur    | 
+---------------------------------+

【问题讨论】:

  • 它们不是多余的,它们显示了一种关系。如果您想以不同的方式显示数据,请在前端(应用程序或报告工具)的表示层中进行,而不是在后端。
  • 感谢@under。是的,您对这种关系的看法是正确的,并且在前端进行,但我只是想知道在后端是否有任何完美/标准的方法。
  • “我想获取 columnA 为 123 的 columnB 和 columnC 的所有值”不清楚。有人会期望您指的是其中一个或另一个中的行,或者两者中的行(带有 123)。但是从您的查询和示例结果来看,您似乎是指 columnB-columnC 对,其中 columnB 在 Table1 中显示为 123,而 columnC 在 Table2 中显示为 iwth 123。你不能用语言走捷径,它会给出一些模棱两可、错误或荒谬的东西(委婉语:“不清楚”)。您也可以调用您不想要的结果。请努力说得更清楚。
  • @philipxy 抱歉,如果不清楚。我需要两个表中针对 columnA=123 的值。我已经用问题末尾的示例输出为您更新了问题。如果空格可以被 NULL 替换,则没有问题。现在清楚了吗?
  • 您看不出“两个表中的值与 columnA=123 相对应”只是一堆与您对旧查询的想法有关但没有说出来的词吗? (看看我是如何写得很清楚的。)(“反对”的定义是什么?)(修辞。)我确实从你的旧输出和描述它有多糟糕的描述中预料到了这张图片。但是:在多个 A 值与多个 B 值匹配的一般情况中,所需的输出是什么?这里有任何相关的 PKs/UNIQUEs/CKsFKs 吗? A什么时候保留vs null?这就是为什么没有minimal reproducible example 的问题是题外话。

标签: mysql sql-server database


【解决方案1】:

你可以使用它。我希望它对你有用。

;WITH temp AS
(
    SELECT *,
           Row_number() over(partition by A.columnA order by A.columnC) as [Rn]           
    FROM 
    (
      SELECT Table1.columnA, Table1.columnB, Table2.columnC
      FROM Table1
      INNER JOIN Table2 ON Table1.columnA = Table2.columnA
      WHERE Table1.columnA = '123'
    ) A
)
SELECT 
(CASE WHEN [Rn] = 1 THEN columnB ELSE NULL END) columnB
,columnC
FROM temp

【讨论】:

    【解决方案2】:

    基于 Tien Nguyen 的建议。

            SELECT  IF(ctr = 1, columnB, '') columnB ,
                    columnC
            FROM    ( SELECT    a.columnB ,
                                b.columnC ,
                                ROW_NUMBER() OVER ( PARTITION BY a.columnA ORDER BY b.columnA ) AS ctr
                      FROM      Table1 A
                                INNER JOIN Table2 B ON b.columnA = a.columnA
                      WHERE     a.columnA = '123'
                    ) tbl
    

    结果:

        columnB     columnC
        ----------- ------------
        lorem       sit
                    amet
                    consectetur
    
        (3 row(s) affected)
    

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 2012-03-22
      • 2012-07-23
      • 2023-03-21
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多