我有一个带有表的SQLite3数据库,我需要根据几个因素对其进行过滤。一旦这样的因素是根据同一个表中其他行的内容过滤我们的行。
根据我的研究,自我JOIN
将被要求,但我不知道如何通过几个因素过滤表格。
以下是数据的示例表:
Name Part # Status Amount
---------------------------------
Item 1 12345 New $100.00
Item 2 12345 New $15.00
Item 3 35864 Old $132.56
Item 4 12345 Old $15.00
我需要做的是找到具有相同Item
的任何Part #
,其中一个有“旧”Status
且Amount
是相同的
因此,首先我们将获得Part #
“12345”的所有行,然后检查是否有任何行具有匹配Amount
的“旧”状态。在此示例中,我们将Item2
和Item4
作为结果。
现在需要做的是返回表中具有“新”Status
的行的REST,基本上丢弃这两个项目。
期望的输出:
Name Part # Status Amount
---------------------------------
Item 1 12345 New $100.00
删除了所有“旧”状态行以及任何具有“旧”状态匹配“部件号”和“金额”的“新”。(对不起,我知道这是非常困惑,因此我需要帮助。)
我已经调查了以下资源,试图自己解决这个问题,但是有很多层次让我感到困惑。
前两个链接涉及比较同一个表中的列。第三个似乎是一个非常相似的问题,但没有一个可读的答案(对我来说,无论如何)。
我也进行Java开发,在那里执行此操作相当简单,但我希望在可能的情况下使用单个SQL查询(嵌套)。
答案 0 :(得分:2)
“不存在”的陈述应该可以解决问题:
select * from table t1
where t1.Status = 'New'
and not exists (select * from table t2
where t2.Status = 'Old'
and t2.Part = t1.Part
and t2.Amount = t1.Amount);
答案 1 :(得分:0)
这是一个T-SQL答案。希望它是可翻译的。如果您有匹配的大数据集,则可能会将not in更改为!Exists。
select *
from table
where Name not in(
select Name
from table t1
join table t2
on t1.PartNumber = t2.PartNumber
AND t1.Status='New'
AND t2.Status='Old'
and t1.Amount=t2.Amount)
and Status = 'New'
答案 2 :(得分:0)
试图明白你最想要的东西......
SELECT DISTINCT yt.PartNum, yt.Status, yt.Amount
FROM YourTable yt
JOIN YourTable yt2
ON yt2.PartNum = yt.PartNum
AND yt2.Status = 'Old'
AND yt2.Amount != yt.Amount
WHERE yt.Status = 'New'
这为所有具有旧状态且价格不同的新状态提供了支持。
答案 3 :(得分:0)
可能正在使用一个内部加入分组选择来获取状态旧而不仅仅是这个
select * from
my_table
INNER JOIN (
select
Part_#
, Amount
, count(distinct Status)
, sum(case when Status = 'Old' then 1 else 0 )
from my_table
group part_#, Amount,
having count(distinct Status)>1
and sum(case when Status = 'Old' then 1 else 0 ) > 0
) t on.t.part_# = my_table.part_#
and status = 'new'
and my_table.Amount <> t.Amount