我有三张表,分别是投诉表、投诉明细表和人员表。
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条答案
按热度按时间hrirmatl1#
为了得到你想要的,你可以使用
LEFT JOIN
这样的人和抱怨细节修正
WHERE
具有zzwlnbp82#
据我所知,有两种方法来理解你的问题。您的现有查询对于其中一个是正确的。
第一种解释是:“给我所有有关匹配的人的信息
@personId
参数,并从投诉和投诉详细信息中查找与此人无关的所有列值。”第二种解释是:“把所有与我无关的抱怨都告诉我
@personId
,并向我提供与该投诉有关的人的详细信息”。所以区别就在于你从
person
表:匹配人员的值@personId
,与实际与投诉相关的人的价值观不匹配@personId
.您现有的查询将正确地给出第一个结果,因此我猜您不希望这样。所以我推断你一定想要第二个结果。那就是:
dsekswqp3#
我想创建一个select过程来查找与该person.id不相关的所有投诉
使用
cross join
产生所有人和投诉的组合。然后过滤掉那些存在的: