以下是我想要达到的目标:
有四个表,我必须参考,以获得我要找的数据。列表、部件、列表项和标签符号。
列表中有表示每个列表的记录
listitem表引用list.id并表示每个列表上的所有项
零件表包含所有零件,每个零件都有一个唯一的id
labelassign表具有友好标签(如标记),其中引用partid以标记零件。
视觉效果:
列表
id name
-- ----
1 part1
2 part2
3 part3
4 part4
列表项
id partId listId
-- ---- ------
1 10 1
2 11 1
3 12 1
4 13 2
5 14 2
零件
id name
-- ----
1 part1
2 part2
3 part3
4 part4
10 part10
11 part11
12 part12
13 part13
14 part14
唇裂征
id label partId
-- ----- ----
1 StandardParts 1
2 StandardParts 2
3 SmallParts 3
4 LargeParts 4
5 HugeParts 5
6 MediumParts 10
7 MediumParts 11
8 MediumParts 12
9 SmallParts 13
10 MediumParts 14
要获取具有特定标签的所有列表,请执行以下操作:
SELECT list.name
FROM list
INNER JOIN part ON list.name = part.name
INNER JOIN labelassign ON part.id = labelassign.partId AND labelassign.label LIKE '%StandardParts%'
# Using LIKE for '%StandardParts%' because there are variations in the real data but I want them all
如果list.name记录没有standardparts标签,则应从结果中排除这些记录。
第二部分比较棘手,我遇到了麻烦。
每个 list
记录有多个 listitem
表示该列表上项目的记录。全部 list
有standardparts标签的记录应至少有一个 listitem
记录一个小零件标签,但不是所有做和不做的是我想找到的。 listitem
记录被称为属于一个特定的列表 listitem.listId
现场。所以,对于每个 list
我想检查一下 listitem
s将smallparts作为标签(通过检查匹配的部分,以及上面显示的该部分的标签),如果没有这些 listitem
我想要父母吗 list
记录保存在结果集中。否则 list.name
应该从结果中排除。
根据@eric brandt的初步回答,我目前得到的是:
SELECT DISTINCT
l.id,
l.num
FROM
list AS l
INNER JOIN
part AS p1
ON b.num = p1.num
# Without this up here I didn't get the filtration, lists without the StandardParts label were included in results
INNER JOIN
labelassign AS la
ON p1.id = la.partId
AND la.label LIKE '%StandardParts%'
INNER JOIN
listitem AS li
ON l.id = li.listId
INNER JOIN
part AS p
ON li.partId = p.id
WHERE
EXISTS
(
SELECT 1
FROM
labelassign AS la1
WHERE
la1.partId = p.id AND
la1.label LIKE '%StandardParts%'
)
AND NOT EXISTS
(
SELECT 1
FROM
labelassign AS la2
WHERE
la2.partId = p.id AND
la2.label LIKE '%SmallParts%'
);
上述情况仍然存在 list
记录有 listitem
有适当小零件标签的记录。同样,我们的目标是过滤掉这些,因为我不需要修复它们。我在寻找所有 list
没有 listitem
用小零件的标签记录。
预期结果
id name
-- ----
1 part1
只应返回list.id 1,因为它有一个standardparts标签,而它的listitems没有一个小部件标签。list.id 2确实有一个standardparts的标签,但它的一个listitems有一个smallparts的标签,因此应该将其排除在外。
这个问题涉及到我的问题,但主要是面向java的,答案并没有回答我的问题。
这个问题再次与我的问题擦肩而过,但实际上是一个不同的问题,即另一个表中不存在的值,而不是基于某个值存在的排除。
如果我遗漏了什么,我很乐意提供更多的信息。
2条答案
按热度按时间7gcisfzg1#
你想要一个« 左连接 » 在具有« 小零件 », 使用where子句筛选出匹配的行。你可以用« 选择distinct » 以避免重复。最后,我怀疑你不需要加入上表« 零件 », 我把它拿走了。
hiz5n14c2#
我想试试
EXISTS
要查找的子句list.id
有一个StandardParts
标签,然后是NOT EXISTS
子句将这些结果限制在没有部件具有SmallParts
标签。