创建此选择过程需要帮助吗

bn31dyow  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(260)

我有三张表,分别是投诉表、投诉明细表和人员表。

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
hrirmatl

hrirmatl1#

为了得到你想要的,你可以使用 LEFT JOIN 这样的人和抱怨细节

LEFT JOIN Person ON ComplaintDetail.personId = Person.id

修正 WHERE 具有

AND ComplaintDetail.personId IS NULL
zzwlnbp8

zzwlnbp82#

据我所知,有两种方法来理解你的问题。您的现有查询对于其中一个是正确的。
第一种解释是:“给我所有有关匹配的人的信息 @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
dsekswqp

dsekswqp3#

我想创建一个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;

相关问题