ASP.NET SQL устраняет дублирующиеся идентификаторы - PullRequest
0 голосов
/ 16 июня 2019

У меня есть две таблицы базы данных для документирования процесса заживления ран.Они объединяются в столбец wound_id-Column следующим образом:

Так что для одной раны я могу создать много прогрессов, чтобы показать ее заживление.Это работает нормально.

Вот код для таблиц:

Таблица wound_details:

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,Вот пример, чтобы вы могли понять, что я имею в виду:

GridView Screenshot

Что я хочу сделать, это просто показать последние успехи одной раны, поэтому дляВ приведенном выше примере просто показана последняя запись с progressID 65:

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

Подход SELECT DISTINCT не сработал, и я также пытался использовать MAX (progressID), но мне всегда кажется, что получаются ошибки.Я думаю, что я должен сделать что-то с ORDER BY или вторым SELECT-Query перед JOIN.

Спасибо за любой совет!

Ответы [ 3 ]

1 голос
/ 16 июня 2019

Поскольку вам нужен только progress_id, для этого проще всего использовать коррелированный подзапрос:

SELECT  wound_id, 
        casenumber, 
        wound_type, 
        (
            SELECT TOP 1 progress_id
             FROM dbo.epadoc_mod_wound_progress AS WP
             WHERE WP.wound_id = WD.wound_id
             ORDER BY progress_id
        ) As progress_id, 
        wound_comments, 
        wound_timeReal, 
        username    
FROM dbo.epadoc_mod_wound_details As WD
WHERE casenumber = @casenr;
1 голос
/ 16 июня 2019

Я понимаю, что вам нужна каждая запись "epadoc_mod_wound_details" с последней записью "epadoc_mod_wound_progress".

Вы можете попробовать это:

    select wound.wound_id, wound.casenumber, wound.wound_type, 
    wound.wound_comments, wound.wound_timeReal, wound.username, MAX(progress_id) 
    from epadoc_mod_wound_details wound
    left join epadoc_mod_wound_progress progress on wound.wound_id = progress.wound_id
    where wound.casenumber = ''
    group by wound.wound_id, wound.casenumber, wound.wound_type,
    wound.wound_comments, wound.wound_timeReal, wound.username
1 голос
/ 16 июня 2019

Вы должны использовать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...