具有自JOIN的嵌套SQL查询 - 如何过滤行OUT

时间:2017-07-19 19:40:49

标签: sql sqlite

我有一个带有表的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 #,其中一个有“旧”StatusAmount是相同的

因此,首先我们将获得Part #“12345”的所有行,然后检查是否有任何行具有匹配Amount的“旧”状态。在此示例中,我们将Item2Item4作为结果。

现在需要做的是返回表中具有“新”Status的行的REST,基本上丢弃这两个项目。

期望的输出:

Name    Part #  Status  Amount
---------------------------------           
Item 1  12345   New     $100.00

删除了所有“旧”状态行以及任何具有“旧”状态匹配“部件号”和“金额”的“新”。(对不起,我知道这是非常困惑,因此我需要帮助。)

我已经调查了以下资源,试图自己解决这个问题,但是有很多层次让我感到困惑。

前两个链接涉及比较同一个表中的列。第三个似乎是一个非常相似的问题,但没有一个可读的答案(对我来说,无论如何)。

我也进行Java开发,在那里执行此操作相当简单,但我希望在可能的情况下使用单个SQL查询(嵌套)。

4 个答案:

答案 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