繁体   English   中英

mySQL 连接表,但根据来自另一列的匹配条件排除具有特定 ID/值的所有行(条件仅包含在某些行中)

[英]mySQL Join Tables but exclude ALL rows with a certain ID/value based on matching criteria from another column (criteria contained in only some rows)

对 SQL 来说非常新,所以我什至不知道如何正确表达我的问题,也许这就是我似乎找不到答案的原因。 我要做的基本上是根据另一列的匹配条件通过 ID 列从表中包含或排除所有行。 相反,仅包含/排除具有条件的行,而不是所有具有匹配 ID 的行。

我想我基本上是在尝试做这个问题中提出的问题,但是由于缺少权限,我不能在 mySQL 中使用“创建临时表”命令(我假设任何其他临时表方法也会因为这个原因而失败...... )

我有两张桌子:

批处理表

批号 信息
100 BBB
101 AAA
102 AAA

样本表

样品编号 样品类型 批号 地位
1 批次_QC_1 100 '经过'
2 批次_QC_1 100 '经过'
3 批次_QC_2 100 '经过'
4 批次_QC_2 100 '经过'
5 常规的 100 '积极的'
6 常规的 100 '积极的'
7 常规的 100 '消极的'
8 常规的 100 '消极的'
9 批次_QC_1 101 '经过'
10 批次_QC_1 101 'QC_1 失败'
11 批次_QC_2 101 '经过'
12 批次_QC_2 101 '经过'
13 常规的 101 '积极的'
14 常规的 101 '积极的'
15 常规的 101 '消极的'
16 常规的 101 '消极的'

我需要组合 batch_table 和 sample_table,只保留“通过的批次”。 每个批次都是 batch_table 中的一个键。 我需要检查 sample_table 的内容以查看批次是否已通过。 通过定义为 Status 列 = 'pass' 的所有行,其中 SampleType 为 'Batch_QC_1' 或 'Batch_QC_2'。 然后我想通过整个 BatchNo 包含/排除。 所以在示例数据中,因为有一行 (sampleNo = 10),其中 Status 列不是“pass”,SampleType 列是“Batch_QC_1”。 我想排除所有具有相同 BatchNo ('101') 的行,而不仅仅是那个。

我已经尝试了很多事情——大多数似乎只删除了不等于“通过”的行,并且确实删除了具有相同匹配 BatchNo 的所有行。

例如,我尝试过这样的事情:

SELECT 
sample_table.SampleNo, sample_tables.SampleType, sample_table.BatchNo, sample_table.Status, batch_table.Info

FROM 
batch_table
JOIN sample_table on batch_table.BatchNo = sample_table.BatchNo 
WHERE sample_table.Status NOT IN ('QC_1_FAIL', 'QC_2_FAIL')

这将返回状态 = 'QC_2_FAIL' 的 sample_table 中除 row/sampleNo 10 之外的所有行。 我想要排除与第 10 行具有相同 BatchNo 的所有行(或具有匹配条件的任何行)。

查询结果(排除单行,SampleNo = 10)

样品编号 样品类型 批号 地位 信息
1 批次_QC_1 100 '经过' BBB
2 批次_QC_1 100 '经过' BBB
3 批次_QC_2 100 '经过' BBB
4 批次_QC_2 100 '经过' BBB
5 常规的 100 '积极的' BBB
6 常规的 100 '积极的' BBB
7 常规的 100 '消极的' BBB
8 常规的 100 '消极的' BBB
9 批次_QC_1 101 '经过' AAA
11 批次_QC_2 101 '经过' AAA
12 批次_QC_2 101 '经过' AAA
13 常规的 101 '积极的' AAA
14 常规的 101 '积极的' AAA
15 常规的 101 '消极的' AAA
16 常规的 101 '消极的' AAA

期望的结果(排除 BatchNo = 101 的所有行)

样品编号 样品类型 批号 地位 信息
1 批次_QC_1 100 '经过' BBB
2 批次_QC_1 100 '经过' BBB
3 批次_QC_2 100 '经过' BBB
4 批次_QC_2 100 '经过' BBB
5 常规的 100 '积极的' BBB
6 常规的 100 '积极的' BBB
7 常规的 100 '消极的' BBB
8 常规的 100 '消极的' BBB

我也尝试使用左/右连接的变体,但我认为我的问题更多在于我不知道如何正确构建查询的 WHERE 部分。 我认为临时表可能有效,但由于权限,我似乎无法这样做。 如果无法使用标准 WHERE 子句,那么是否可以使用临时变量来创建额外的通过/失败列? 太感谢了。

SELECT s.SampleNo, s.SampleType, s.BatchNo, s.Status, b.Info FROM sample_table s 
INNER JOIN batch_table b on s.BatchNo = b.BatchNo
WHERE s.BatchNo NOT IN (
           SELECT DISTINCT(BatchNo) FROM sample_table WHERE Status != 'pass' AND 
           SampleType IN ('Batch_QC_2', 'Batch_QC_1')
          );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM