首页 > 解决方案 > ASP.NET SQL 消除重复 ID

问题描述

我有两个用于记录伤口愈合进程的数据库表。这些是像这样连接在wound_id-Column上的:

所以对于一个伤口,我可以创造许多进步来展示它的愈合。这工作正常。

这是表格的代码:

表伤口_详细信息:

CREATE TABLE [dbo].[epadoc_mod_wound_details] (
    [wound_id]          INT           IDENTITY (1, 1) NOT NULL,
    [wound_type]        VARCHAR (500) NULL,
    [wound_description] VARCHAR (500) NULL,
    [decuGrade]         INT           NULL,
    [wound_comments]    VARCHAR (500) NULL,
    [wound_timeReal]    DATETIME      NULL,
    [wound_timeGiven]   DATETIME      NULL,
    [casenumber]        INT           NULL,
    [username]          VARCHAR (50)  NULL,
    [infectionstate]    VARCHAR (50)  NULL,
    PRIMARY KEY CLUSTERED ([wound_id] ASC)
);

表wound_progress:

CREATE TABLE [dbo].[epadoc_mod_wound_progress] (
    [progress_id]       INT           IDENTITY (1, 1) NOT NULL,
    [wound_length]      INT           NULL,
    [wound_width]       INT           NULL,
    [wound_depth]       INT           NULL,
    [wound_surrounding] VARCHAR (500) NULL,
    [wound_consistence] VARCHAR (500) NULL,
    [wound_state]       VARCHAR (200) NULL,
    [wound_painscale]   INT           NULL,
    [wound_itch]        INT           NULL,
    [wound_id]          INT           NULL,
    PRIMARY KEY CLUSTERED ([progress_id] ASC),
    CONSTRAINT [FK_epadoc_mod_wound_progress_fk] FOREIGN KEY ([wound_id]) REFERENCES [dbo].[epadoc_mod_wound_details] ([wound_id]) ON DELETE CASCADE
);

然后我写了一个 SELECT-Query 来显示为患者记录的特定病例编号的所有伤口:

SELECT DISTINCT
    dbo.epadoc_mod_wound_details.wound_id, dbo.epadoc_mod_wound_details.casenumber, dbo.epadoc_mod_wound_details.wound_type, dbo.epadoc_mod_wound_progress.progress_id, dbo.epadoc_mod_wound_details.wound_comments, dbo.epadoc_mod_wound_details.wound_timeReal, dbo.epadoc_mod_wound_details.username    
FROM dbo.epadoc_mod_wound_details LEFT JOIN 
     dbo.epadoc_mod_wound_progress
     ON dbo.epadoc_mod_wound_details.wound_id = dbo.epadoc_mod_wound_progress.wound_id
WHERE dbo.epadoc_mod_wound_details.casenumber = @casenr;

虽然这工作正常,但问题是所有伤口进展都显示在 GridView 中,这是一个示例,因此您可以了解我的意思:

网格视图截图

我想要做的只是显示一个伤口的最新进展,所以对于上面的例子,只显示progressID 65的最后一个条目:

33     65          1111111  Dekubitus   
34         ..          .......  .........

SELECT DISTINCT 方法不起作用,我也尝试使用 MAX(progressID) 但我似乎总是出错。我想我必须在 JOIN 之前使用 ORDER BY 或第二个 SELECT-Query 做一些事情。

感谢您的任何建议!

标签: c#sqlsql-server

解决方案


您应该在查询中GROUP BY结合使用MAX

SELECT  
   dbo.epadoc_mod_wound_details.wound_id, 
   dbo.epadoc_mod_wound_details.casenumber, 
   dbo.epadoc_mod_wound_details.wound_type, 
   MAX(dbo.epadoc_mod_wound_progress.progress_id) AS progress_id, 
   dbo.epadoc_mod_wound_details.wound_comments, 
   dbo.epadoc_mod_wound_details.wound_timeReal, 
   dbo.epadoc_mod_wound_details.username    
FROM 
  dbo.epadoc_mod_wound_details 
LEFT JOIN 
  dbo.epadoc_mod_wound_progress ON 
  dbo.epadoc_mod_wound_details.wound_id = dbo.epadoc_mod_wound_progress.wound_id 
GROUP BY
   dbo.epadoc_mod_wound_details.wound_id, 
   dbo.epadoc_mod_wound_details.casenumber, 
   dbo.epadoc_mod_wound_details.wound_type, 
   dbo.epadoc_mod_wound_details.wound_comments, 
   dbo.epadoc_mod_wound_details.wound_timeReal, 
   dbo.epadoc_mod_wound_details.username;

推荐阅读