Как выбрать строки из одной таблицы, которые не существуют в другой таблице с указанным значением c - PullRequest
0 голосов
/ 06 марта 2020

Я знаю, это звучит просто, и я нашел много похожих примеров, но не могу понять, соответствует ли это моей конкретной проблеме c.

Я пробовал несколько вложенных выборок и некоторые левые объединения, но они не работали.

У меня есть таблица Building и таблица ComplianceItems. У здания может быть много ComplianceItems. У меня также есть таблица ComplianceItemType, которая содержит все возможные типы.

Я хочу найти все Здания, которые не имеют ComplianceItem типа 17 или 18. Я вижу много примеров, которые выбирают родительскую запись, когда нет дочерних записей. Но я хочу выбрать все родительские записи, которые не имеют элемента соответствия типа 17 или 18

Как я могу добавить это условие в свой запрос?

select OC.lOwnersCorporationID
From Strata.dbo.OwnersCorporation OC
Left Join ComplianceDEMO.dbo.ComplianceItem CI on OC.lOwnersCorporationID = CI.OwnersCorporationID
Where CI.OwnersCorporationID IS NULL
AND OC.bManaged = 'Y'

Кстати, я надеваю не заботятся о производительности, так как этот запрос будет выполняться только один раз и использоваться как часть оператора вставки для создания отсутствующих записей.

ОБНОВЛЕНИЕ

Очевидно, мои данные более сложны, чем эти, но это должно дать вам представление.

Table Definition
  Ownerscorporation Table
    OwnersCorporationID    INT   PK
    PlanNumber             Varchar(10)

  ComplianceItem Table
    ComplianceItemID      INT    PK
    ComplianceTypeID      INT    FK
    OwnersCorporationID   INT    FK

  ComplianceType Table
    ComplianceTypeID      INT    PK
    Name                  varchar(50)

Test Data
Owners Corporation Table
ID        PlanNumber
===============================================
1         1001
2         1002
3         1003


Compliance Item Table
ComplianceItemID     ComplianceTypeID    OwnersCorporationID
==================================================================
1                    1                   1           
2                    2                   1
3                    3                   1
4                    4                   1
5                    5                   1
6                    1                   2
7                    2                   2
8                    4                   2
9                    1                   3
10                   2                   3
11                   3                   3


Compliance Type Table
==================================================================
ComplianceTypeID     Name
1                    Asbestos Report
2                    Capital Works Fund
3                    Anchor Point Compliance
4                    Window Lock Compliance
5                    Pool Compliance



The Problem
=========================
Probably easier in two parts.
Find all the OwnersCorporations That Don't have a Compliance type of 4
Find all the OwnersCorporations That Don't have a Compliance type of 5

Expected Results
=========================
Part 1
OwnersCorporationID
3

Part 2
OwnersCorporationID
2
3

ОБНОВЛЕНИЕ 2

Похоже, ответ Мэтта в комментариях работал над тестовыми данными.

Select OwnersCorporationID
From OwnersCorporationTable
Where OwnersCorporationID Not In
(
    Select OwnersCorporationID 
    From ComplianceItemTable
    Where (ComplianceTypeID =5 )

Возвращено 2 и 3

И

Select OwnersCorporationID
From OwnersCorporationTable
Where OwnersCorporationID Not In
(
    Select OwnersCorporationID 
    From ComplianceItemTable
    Where (ComplianceTypeID =4 )

Возвращено 3 Мне нужно будет запустить его в две части, когда я буду использовать его для создания отсутствующих записей. Я постараюсь преобразовать его для работы с моими реальными данными. Надеюсь, я не слишком упростила это :) Спасибо за вашу помощь, Мэтт. Если вы хотите получить баллы, пожалуйста, оставьте это как ответ.

1 Ответ

0 голосов
/ 06 марта 2020

Возможно, вы ищете это

SELECT OC.lOwnersCorporationID
From Strata.dbo.OwnersCorporation OC
INNER JOIN ComplianceDEMO.dbo.ComplianceItem CI on OC.lOwnersCorporationID = CI.OwnersCorporationID AND 
CI.ComplianceTypeID NOT IN (17,18) AND
OC.bManaged = 'Y'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...