【问题标题】:SQL - Is it possible to collapse or merge duplicate cells into a single cell once?SQL - 是否可以一次将重复的单元格折叠或合并到一个单元格中?
【发布时间】:2015-08-02 13:32:41
【问题描述】:

我一直在寻找这样的问题,但没有找到。

我的问题是,是否甚至可以隐藏其他重复的单元格值并在连接表中仅显示其中一个唯一值?请参阅下表进行说明。

Table 1                   Table 2
ID    Gender              ID    NAME
1     Male                1     John
2     Female              2     Ann
3     Gay                 3     George
4     Gay                 4     James
5     Gay                 5     Justin
6     Bisexual            6     Floyd

Results table

Result 1                    Result 2

GENDER    NAME              GENDER    NAME
Male      John              Male      John
Female    Ann               Female    Ann
Gay       George            Gay       George
Gay       James                       James
Gay       Justin                      Justin
Bisexual  Floyd             Bisexual  Floyd

现在,在上面的表格中,我们都知道乔治、詹姆斯和贾斯汀是同一性别。在正常的 JOIN 查询中,将显示右侧的结果表,但我需要的是左侧结果表显示的内容。请注意,右侧结果表中的第 4 行和第 5 行第 1 列有空值。

顺便说一句,如果有解决此问题的技巧只能在除 MS Access 或 C# DataGridView 解决方法之外的其他 RDBMS 中使用,那么我需要这个使用 C# 和 MS Access 数据库通过 OleDb 编写的应用程序也让我知道。

【问题讨论】:

    标签: c# sql ms-access


    【解决方案1】:

    在数据库查询中处理这种需求有点奇怪——最好只在 UI 或应用程序层显示。查询中的行通常/更容易被认为是彼此独立且没有特定顺序的。

    我不了解 MS Access 的功能,但在 MS SQL 数据库中,您可以使用类似 SELECT ... ROW_NUMBER() OVER (PARTITION BY Gender ORDER BY _?_) AS IndexByGender 的东西,这将为除 James 和 Justin 之外的所有人提供 IndexByGender1,然后您也可以进行更多计算在 SQL 查询或应用程序中IndexByGender 等于 1 时显示性别。

    而且,嗯,为了清楚起见,我保留了您的术语,但您的示例数据混合了“GenderIdentity”(或者可能是“AnatomicalGender”)和“SexualOrientation”的概念 - 所以如果这是您的真实领域,将它们分开可能是一个更有用的设计。只是说说而已。

    【讨论】:

    • 好的,但是您知道在 UI 部分管理它吗?我猜我应该处理 DataGridView 事件,对吧?如果是这样,那效率会低吗?
    • 我不确定如何在 datagridview 中准确处理这个问题,因为我不再使用它们了,但是如果你想在数据级别处理它,那么你可能需要迭代在某个时间点覆盖数据并清除重复的值或创建一个新列,即 Index 指标(或 IsFirstOfGroup 指标)
    【解决方案2】:

    这种类型的结果可以在任何 SQL 方言中生成。从您的初始关系执行所需的Order By 并为每一行计算一个行号。现在 self-left-outer-join 在lhs.rownumber = rhs.rownumber - 1 上与自身的关系,并且仅在coalesce(rhs.GENDER,' ') <> lhs.GENDER 时从 lhs 输出您想要的GENDER 列(即lhs.GENDER)。

    在某些 SQL 方言中,可能需要将您的关系存储在临时表中以生成行号值。如有必要,不要害怕这样做。当您需要在关系的连续行之间创建窗口关系时,这种自左外连接技术广泛适用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多