Как выполнить всю группу, если эта группа содержит значение в определенном столбце в SQL - PullRequest
1 голос
/ 05 ноября 2019

Ниже приведен пример трех типов таблиц, которые у меня есть

    CREATE TABLE TestCs(
    [DefendantNumber] VARCHAR(60),
    [FileNumber] VARCHAR(60),
    [ReferralDate] datetime,
    [BookedFirstName] VARCHAR(60),
    )

        INSERT INTO TestCs VALUES ('1111','510-1','2019-01-01','Mike')
        INSERT INTO TestCs VALUES ('1111','510-2','2019-01-01','Mike')
        INSERT INTO TestCs VALUES ('2222','510-3','2019-01-02','John')
        INSERT INTO TestCs VALUES ('3333','510-4','2019-01-04','Kelly')
        INSERT INTO TestCs VALUES ('444','510-5','2019-01-04','Lamar')

    CREATE TABLE Testcharge(
    [FileNumber] VARCHAR(60),
    [ChargeDescription] VARCHAR (60)
    )

    INSERT INTO Testcharge VALUES('510-1','Mu')
    INSERT INTO Testcharge VALUES('510-1','St')
    INSERT INTO Testcharge VALUES('510-2','Bu')
    INSERT INTO Testcharge VALUES('510-2','Po')
    INSERT INTO Testcharge VALUES ('510-3','Po')
    INSERT INTO Testcharge VALUES ('510-3','Sp')
    INSERT INTO Testcharge VALUES('510-4','Po')
    INSERT INTO Testcharge VALUES('510-5','Ra')
    INSERT INTO Testcharge VALUES('510-5','Bu')


CREATE TABLE TestEvent(
[FileNumber] VARCHAR(60),
[EventCode] VARCHAR (60)
)

INSERT INTO TestEvent VALUES('510-1','TR')
INSERT INTO TestEvent VALUES('510-1','HRL')
INSERT INTO TestEvent VALUES('510-1','CSCT')
INSERT INTO TestEvent VALUES('510-2','PREL')
INSERT INTO TestEvent VALUES('510-2','CSCT')
INSERT INTO TestEvent VALUES('510-3','GJ')
INSERT INTO TestEvent VALUES('510-3','DIV')
INSERT INTO TestEvent VALUES('510-3','CSCT')
INSERT INTO TestEvent VALUES('510-4','FLW')
INSERT INTO TestEvent VALUES('510-4','CST')
INSERT INTO TestEvent VALUES('510-5','CAP')
INSERT INTO TestEvent VALUES('510-5','CSCT')

Мне удалось связать эти таблицы с помощью следующего запроса

SELECT cs.DefendantNumber,
cs.FileNumber,
cs.ReferralDate,
cs.BookedFirstName,
chrg.ChargeDescription,
ev.EventCode,
chrg.ChargeDescription 
FROM TestCs AS cs INNER JOIN Testcharge AS chrg
ON cs.FileNumber=chrg.FileNumber LEFT JOIN TestEvent AS ev 
ON ev.FileNumber=cs.FileNumber
WHERE DefendantNumber IN (SELECT DefendantNumber FROM TestCs GROUP BY DefendantNumber HAVING COUNT(*)=1) 

Из таблицы, полученной иззапрос выше, я хочу убедиться, что я могу получить FileNumber тех, кто не имеет определенного описания заряда. Например, я хочу убедиться, что я получаю FileNumber от тех, у кого нет определенного типа заряда. Например, FileNumber из тех, у кого нет 'Ra' ChargeDescription

В конце я использовал следующий запрос

AND NOT EXISTS (SELECT 1 FROM TestCs AS cs2 WHERE cs2.FileNumber=cs.FileNumber AND chrg.ChargeDescription='Ra')

Однако он не делает то, чтоЯ собирался. Например, я хочу исключить FileNumber из тех, у кого есть "Ra" в столбце ChargeDescription. Соответственно, я не должен видеть 510-5. Как мне исключить всю группу, если эта группа из FileNumber s содержит определенное значение в столбце ChargeDescription?

Должны появиться только следующие значения:

FileNumber  DefendantNumber
510-3   2222
510-3   2222
510-3   2222
510-3   2222
510-3   2222
510-3   2222
510-4   3333
510-4   3333

1 Ответ

2 голосов
/ 05 ноября 2019

Для этого вы можете использовать коррелированный подзапрос с NOT EXISTS.

SELECT cs.DefendantNumber,
    cs.FileNumber,
    cs.ReferralDate,
    cs.BookedFirstName,
    chrg.ChargeDescription,
    ev.EventCode,
    chrg.ChargeDescription 
FROM TestCs AS cs 
INNER JOIN Testcharge AS chrg ON cs.FileNumber = chrg.FileNumber 
LEFT JOIN TestEvent AS ev ON ev.FileNumber = cs.FileNumber
WHERE cs.DefendantNumber IN 
    (
        SELECT DefendantNumber 
        FROM TestCs 
        GROUP BY DefendantNumber 
        HAVING COUNT(*) = 1
    )
    AND NOT EXISTS 
    (
        SELECT * 
        FROM Testcharge c 
        WHERE c.FileNumber = cs.FileNumber 
            AND c.ChargeDescription = 'Ra'
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...