Нужна помощь в создании этой процедуры SELECT - PullRequest
0 голосов
/ 13 июля 2020

У меня есть три таблицы: Complaint, ComplaintDetail и Person.

create table Complaint (
    id int identity(1,1) primary key,
    complaintName varchar(50),
    datetime datetime,
    place nvarchar(MAX),
    declarantName nvarchar(50),
    detail nvarchar(MAX),
    verifyStatus bit   /* approved or not */
)
go

create table ComplaintDetail (
    id int identity(1,1) primary key,
    personId int,
    constraint cdp foreign key (personId) references Person(id),
    compId int,
    constraint cpc foreign key (compId) references Complaint(id),
    crimeType nvarchar(50)
)
go

create table Person (
    id int primary key,
    name nvarchar(50),
    gender bit NOT NULL,
    dob date,
    address nvarchar(MAX),
    image varchar(100),
    nationality varchar(50),
    job varchar(20),
    alive bit DEFAULT 1
)

Я хочу создать процедуру SELECT , чтобы найти все жалобы, которые не ссылка с этим Person.id

Я пробовал что-то подобное, но это не работает.

CREATE PROC findExcludedComplaints
    @personID int
AS
BEGIN
    SELECT * FROM Complaint
    INNER JOIN ComplaintDetail ON Complaint.id = ComplaintDetail.compId
    INNER JOIN Person ON ComplaintDetail.personId != Person.id
    WHERE Person.id = @personID
END
GO

Ответы [ 3 ]

0 голосов
/ 13 июля 2020

Насколько я могу судить, есть два способа прочитать ваш вопрос. Ваш существующий запрос верен для одного из них.

Первая интерпретация: «Получите мне всю информацию о человеке, соответствующем параметру @personId, а также найдите мне все значения столбцов из жалоб и сведения о жалобе, не относящиеся к этому человеку ».

Вторая интерпретация:« Получите мне все жалобы, не относящиеся к @personId, и предоставьте мне сведения о человеке, который соответствует этой жалобе ".

Таким образом, разница только в том, какие значения вы получаете из таблицы person: значения человека, соответствующего @personId, в сравнении со значениями для человек, который действительно имеет отношение к жалобе и не соответствует @personId.

Ваш существующий запрос правильно даст вам первый результат, поэтому я думаю, вам это не нужно. Итак, я пришел к выводу, что вам нужен второй результат. Это будет:

select  * -- you shouldn't really use select *
from    Person            p
join    ComplaintDetails  d on d.personId = p.id
join    Complaints        c on c.id = d.compId
where   p.id != @personId
0 голосов
/ 13 июля 2020

Я хочу создать процедуру SELECT, чтобы найти все жалобы, которые не связаны с этим Person.id

Используйте cross join для генерации всех комбинаций лиц и жалоб . Затем отфильтруйте те, которые существуют:

select p.*, c.*
from persons p cross join
     complaints c left join
     complaintdetail cd
     on cd.person_id = p.id and cd.complaint_id = c.id
where cd.id is null;
0 голосов
/ 13 июля 2020

Чтобы получить то, что вы хотите, вы можете использовать LEFT JOIN для Person и ComplaintDetail, например,

LEFT JOIN Person ON ComplaintDetail.personId = Person.id

и изменить WHERE на

AND ComplaintDetail.personId IS NULL
...