Sql 在执行语句时忽略重复记录

Sql 在执行语句时忽略重复记录,sql,sql-server,Sql,Sql Server,我只希望获取唯一记录的两个表。我创建了一个简短的SQL查询,如下所示: Declare @tempTable AS TABLE(Country VARCHAR(10),PatientId INT) INSERT INTO @tempTable VALUES ('India',1) Declare @tempStatus AS TABLE(PatientId INT, status VARCHAR(2)) INSERT INTO @tempStatus VALUES (1,'NA'),(1,

我只希望获取唯一记录的两个表。我创建了一个简短的SQL查询,如下所示:

Declare @tempTable AS TABLE(Country VARCHAR(10),PatientId INT) 
INSERT INTO @tempTable VALUES ('India',1)

Declare @tempStatus AS TABLE(PatientId INT, status VARCHAR(2)) 
INSERT INTO @tempStatus VALUES (1,'NA'),(1,'A'),(1,'D'),(1,'R'),(1,'A')

SELECT t.Country,t.PatientId,Status= (CASE 
        WHEN ts.status='A' THEN 'A'
        WHEN ts.status='NA' OR ts.status='D' THEN 'NA'
        ELSE 'R' END)
FROM @tempTable t
LEFT JOIN @tempStatus ts ON t.PatientId=ts.PatientId
它返回我的数据作为

场景:

  • 如果状态为“a”,则它将作为所有5条记录的一行,如输出所示
  • 如果存在状态“NA”或“D”,则它将采用该状态并忽略其他行
  • 根据条件,它应仅返回输出,如下所示:

    Country     PatientId       Status
    India       1               A
    

    是否有人可以帮助您忽略case语句中的重复项。

    似乎您需要将
    case
    表达式包装在
    MAX
    中:

    选择t.国家/地区,
    t、 PatientId,
    MAX(当ts.status='A'然后1 ELSE 0 END时的情况)作为status--使其变短
    来自@attreable t
    左连接@tempStatus ts ON t.PatientId=ts.PatientId
    按t.国家分组,
    t、 PatientId;
    
    您正在寻找基于某些条件的连接的某种不同结果。如果我读了5遍后就知道了

    DECLARE @tempTable TABLE(Country VARCHAR(10),PatientId INT) 
    INSERT INTO @tempTable VALUES ('India',1), ('Foo', 2) -- added dummy
    
    -- renamed PatientId to PId for easier writing
    DECLARE @tempStatus TABLE(PId INT, status VARCHAR(2))
    -- added dummy data
    INSERT INTO @tempStatus VALUES (1,'NA'),(1,'A'),(1,'D'),(1,'R'),(1,'A'),(2,'NA'),(2,'D'),(2,'R')
    
    
    SELECT DISTINCT -- only unique rows
        Country,
        t.PatientId,
        -- only D is replaced in your example with NA, else default status
        CASE WHEN ts.status = 'D' THEN 'NA' ELSE ts.status END AS Status
    FROM @tempTable t
    LEFT JOIN @tempStatus ts ON 
        ( -- first condition
            (SELECT DISTINCT status FROM @tempStatus WHERE status = 'A' and PId = PatientId) IS NOT NULL
            AND PId = PatientId and status = 'A'
        ) OR
        ( -- second condition
            (SELECT DISTINCT status FROM @tempStatus WHERE status = 'A' and PId = PatientId) IS NULL
            AND PId = PatientId
        )
    
    • PatientId 1将只返回一行,并带有
    • Patientid2将返回两行NA和R

    非常感谢。我需要更新我的问题,因为我有多个条件。这两个可以用,但我忘了添加其他。@Lifewithsun。回答完问题后,你不应该改变它。问一个新问题要好得多。你已经劝阻了许多其他人回答你的问题。在得到答案后移动目标柱是非常不受欢迎的;尤其是当它使这些答案无效时。虽然现在看起来您想要的是
    MIN
    而不是
    MAX
    。但是,如果
    'A'
    不在数据中,您也不会说明需要发生什么。@Larnu它将把该状态作为一行。但如果有“A”,则只需要一张记录。我将用场景再次更新我的问题。