这是否可以仅使用SQL实现?

这是否可以仅使用SQL实现?,sql,sql-server,Sql,Sql Server,我有两张桌子。 表1: 表2: 我只知道ProductTypeBase,我使用它从表1中获取BatchId。然后我使用所有的BatchId从表2中获取数据 更多详情: 表1包含许多产品类型的数据。我对Base感兴趣。一旦我获得了ProductTypeBase的所有BatchId,我就用它们从表2中获取数据。表2还有许多产品类型的数据。然而,他们并没有储存它。他们只是存储了BatchId。问题在于,针对给定的UnitNumber生成的BatchId另一个系统记录了seal步骤 现在,我的查询如

我有两张桌子。 表1:

表2:

我只知道ProductType
Base
,我使用它从表1中获取BatchId。然后我使用所有的BatchId从表2中获取数据

更多详情: 表1包含许多
产品类型的数据。我对
Base
感兴趣。一旦我获得了
ProductType
Base
的所有
BatchId
,我就用它们从表2中获取数据。表2还有许多
产品类型的数据。然而,他们并没有储存它。他们只是存储了
BatchId
。问题在于,针对给定的
UnitNumber
生成的
BatchId
另一个系统记录了
seal
步骤

现在,我的查询如下所示:

SELECT 
    Id, 
    AssemblyStep, 
    BatchId, 
    UnitNumber, 
FROM Table2 
WHERE BatchId IN (SELECT DISTINCT BatchId FROM Table1 WHERE ProductType='Base') 
ORDER BY Id ASC
这项工作如绿色行所示,但我无法获得我用红色突出显示的两行

这是意料之中的。但是,是否有一种聪明的方法可以使用一些联接从表2中提取
UnitNumber
8888和9999的完整数据


版本:Microsoft SQL Server 2014

您应该使用左连接,而不是使用WHERE子句。 左联接为您提供从左表返回null的行,但这些行存在于右表中,因此,如果联接未返回所有结果,您将不会错过任何行

SELECT 
    T2.Id, 
    T2.AssemblyStep, 
    T2.BatchId, 
    T2. UnitNumber, 
FROM Table2 T2
LEFT JOIN Table1 T1 ON T1.BatchId = T2.BatchId
ORDER BY T2.Id ASC
简单解 现在,这将满足您的要求:

SELECT * 
FROM Table2 
ORDER BY Id ASC
您似乎有一些逻辑,希望匹配批次ID和产品类型的某些组合以形成外键,而不是仅使用产品类型(如果不在表2中,则不能是外键)或批次ID(您在问题中描述为相关,但提示不是基于您期望的结果)

选择base返回的单元号的所有操作: 如果你想要这个: (1) 从表1中获取ProductType为基础的所有行的BatchId,(2)从表2中获取该批的行 (3) 从表2中获取由(2)生成的单元号的所有其他行,而不考虑批次

…通过步骤(3)确保在与表1中的“基本”批次ID匹配的任何单元上完成活动

然后试试这个:

SELECT *
FROM Table2 
WHERE UnitNumber IN (SELECT UnitNumber FROM Table1 WHERE ProductType='Base')
ORDER BY Id ASC

如果您想要整个表2,您只需要从表2中选择*

从我所看到的,table1没有batchId=222的记录,所以所有batchId为222的table2记录都不应该出现

编辑

因此,如果我理解正确,您还需要table2记录,其中AssemblyStep='Seal',UnitNumber为8888或9999

SELECT 
    Id, 
    AssemblyStep, 
    BatchId, 
    UnitNumber, 
FROM Table2 
WHERE BatchId IN (SELECT DISTINCT BatchId FROM Table1 WHERE ProductType='Base')
    OR
UnitNumber IN (Select DISTINCT UnitNumber FROM Table1 WHERE ProductType='Base') 
ORDER BY Id ASC

查看示例数据并输出连接条件为
BatchId
,因此这应该可以工作

select
    t2.Id, 
    t2.AssemblyStep, 
    t2.BatchId, 
    t2.UnitNumber
from
(select distinct unitnumber from Table1 where producttype='base') t1
join Table2 t2 on t2.unitnumber=t1.unitnumber

根据问题指南,请不要发布代码、数据、错误消息等的图像-复制或在问题中键入文本。请保留图像用于图表或演示渲染错误,这些内容无法通过文本准确描述。另外,请只标记一个RDBMS。如果
WHERE
子句限制性太强,那么它有什么意义?你到底想做什么?你能用UnitNumber而不是BatchID加入吗?您尚未描述UnitNumber的含义,因此它可能不适合,但对于您可以使用的示例数据而言it@MartinCairney最后一个密封步骤将在一天结束时进行,因此数据将在很久以后出现。此脚本将用于轮询和拉取数据。我将使用表1中的SomeId来跟踪我处理了多少记录。一旦我处理了一条记录,我就不会再处理它了。因此,在运行查询时,我可能会错过不存在的密封数据。但会在一天结束后出现。@HoneyBadger我补充了更多细节。这是一个很难描述的问题。如果缺少什么,请告诉我。我可能对数据进行了太多的压缩和简化。我补充了更多细节。它使桌子更长,但更具代表性。谢谢你看。我的问题清单很长。组装步骤是手工输入系统的,可以是任何内容。我想收集ProductType为Base的所有BatchID。然后从表2中,我想要这些BatchId的所有记录,加上具有相同单位编号但其BatchId可能不同的记录。我不确定我是否解释得很好。第三张表格图像有用吗?我相信我现在明白了,请查看我的最新编辑。我不能100%确定你是否只想在“密封”步骤中使用这个,或者这只是一个例子。但如果是的话,这只是一个小小的改变。我添加了更多细节。我觉得我把数据浓缩和简化得太多了。对不起,好的。我熟悉制造WIP数据和系统更新批次/批号中的类似问题,因此我们应该能够做到这一点。那么您想这样做吗(我理解的对吗?)(1)从表1中获取ProductType为Base的所有行的BatchId,(2)从表2中获取该批次的行,(3)从表2中获取由(2)生成的单元号的所有其他行,而不考虑批次。我怀疑您的第3步是为了确保在与表1中的“基本”批次ID匹配的任何单元上完成活动,是否正确?是。你拍得很好。简言之,我想从表2中查看单元号8888和9999的所有事件。检查更新的答案