我将设置一个快速方案然后问我的问题:假设我的仓库有一个DB,其中包含以下字段:StorageBinID,StorageReceivedDT,StorageItem和StorageLocation。
任何单个存储仓都可能有多个记录,因为其中包含多个项目。所以,我想要做的是创建一个只返回不包含某个项目的存储箱的查询,但是,我不想要其余的内容。例如,假设我的仓库中有5000个存储箱,我知道有一些箱子里面没有“ItemX”,列在StorageItem字段中。我想返回StorageBinID的简短列表,而没有获得没有ItemX及其全部内容的所有bin的完整列表。 (我认为排除IN,LIKE和CONTAIN及其NOTS)
我现在的解决方法是运行两个查询,通常在StorageReceivedDT中。第一个是收到日期的垃圾箱,然后第二个是包含ItemX的垃圾箱。然后将.csv文件导入Excel并使用ISNA(MATCH)公式比较两列。
这可以通过查询吗?非常感谢您提出任何建议。
答案 0 :(得分:0)
您可以使用having
子句作为聚合查询执行此操作。只计算" ItemX"的行数。出现在每个箱子中,并选择计数为0
的箱子:
select StorageBinID
from table t
group by StorageBinID
having sum(case when StorageItem = "ItemX" then 1 else 0 end) = 0;
请注意,这仅返回包含一些项目的bin。如果您有完全空的箱子,它们将不会出现在结果中。您没有提供足够的信息来处理这种情况(尽管我可以推测您有一个StorageBins
表来解决这个问题。)
答案 1 :(得分:0)
你使用什么样的SQL? 根据您提供的信息,您可以使用:
select distinct StorageBinID
from table_name
where StorageBinID not in (
select StorageBinID
from table_name
where StorageItem like '%ItemX%'
)
您必须将table_name替换为表的名称。 如果只想要完全匹配(StorageItem恰好是“ItemX”),则应替换条件
where StorageItem like '%ItemX%'
与
where StorageItem = 'ItemX'
另一种选择(应该更快):
select StorageBinID
from table_name
minus
select StorageBinID
from table_name
where StorageItem like '%ItemX%'