我遇到了无法修复的问题。 我一直在查看其他一些帖子,但其中大多数都是复杂的让我理解/使用或不处理同样的问题。
首先是表格:
人
id | amt
=============
1 | 5
2 | 26
3 | 3
目标
id | idPerson | goals
===========================
1 | 1 | "AAA"
2 | 1 | "AAA"
4 | 1 | "DDD"
5 | 2 | "CCC"
6 | 2 | "BBB"
7 | 3 | "AAA"
我想要的: 我需要所有Person ids,其中Person没有目标" AAA"。 目前,一个人在表格目标中只能有1到3个目标。
我的选择:
SELECT Person.id, Person.amt
FROM Person
WHERE amt < 10
AND Person.id IN
(
SELECT Goal.idPerson
FROM Goal
WHERE Person.id = Goal.idPerson
AND Goal.goals != "AAA"
)
如果有可能,有人可以解释我为什么我的SQL不能正常工作以及我必须做些什么不同才能起作用?通过解释,我可以避免将来出现同样的问题。 :)
谢谢。
编辑: 我不认为这会产生问题,但当我不仅仅过滤AAA&#39;而且对于BBB&#39;然后我会得到AAA&#39;&#39; BBB&#39;甚至有两个人。 现在的位置如何:
AND Person.id NOT IN
(
SELECT Goal.idPerson
FROM Goal
WHERE Person.id = Goal.idPerson
AND Goal.goals = 'AAA'
AND Goal.goals = 'BBB'
)
答案 0 :(得分:1)
您不需要将其关联,而是希望使用NOT IN
代替:
select Person.id,
Person.amt
from Person
where amt < 10
and id not in (
select idPerson
from Goal
where goals = 'AAA'
)
答案 1 :(得分:1)
您可能正在寻找NOT EXISTS
而不是
SELECT Person.id, Person.amt
FROM Person
WHERE amt < 10
AND NOT EXISTS
(
SELECT 1
FROM Goal
WHERE idperson = person.id AND goals = "AAA"
)
答案 2 :(得分:1)
您需要使用NOT IN
而不是IN
,例如:
SELECT *
FROM Person
WHERE amt < 10
AND Person.id NOT IN (
SELECT idPerson FROM Goal WHERE goals = 'AAA'
);
答案 3 :(得分:0)
同样改变这个:
AND Goal.goals != 'AAA'
到
select *
from (select distinct empl_name, cal_date from first_tbl, second_tbl
where cal_date between [start date] and [end date]) as nested
left join second_tbl
on nested.empl_name = table_2.empl_name
and nested.cal_date = table_2.work_date
答案 4 :(得分:0)
您的子选择过滤掉与#34; AAA&#34;不匹配的所有行。这包括&#34; DDD&#34;。你可以使用
mTasksRepository