SQL - 显示在 WHERE <column> IN 子句中选择的值

SQL - Display value selected in WHERE <column> IN clause

已解决(见下文)

我有以下 table(只显示相关的列和行):

table_1
| result | date       | id |  
|--------|------------|----|  
| A      | 12.04.2020 | 42 |    
| B      | 15.04.2020 | 42 |  
| B      | NULL       | 42 |  
| C      | NULL       | 42 |  
| C      | 05.04.2020 | 42 |  
| A      | 23.02.2019 | 43 | 
| B      | 25.02.2019 | 43 | 
| ...    | ...        | ...|

我有以下声明(它不完全符合我的要求,应该修改):

SELECT result, date, id 
-- some joins to get all data from different tables, I hope it is not relevant for this
FROM table_1 
WHERE result LIKE '%A%' 
AND NOT date = NULL
AND id IN 
(
  SELECT id 
  FROM table_1 
  -- some joins which I also hope are not relevant... 
  WHERE result LIKE '%B%' 
  AND NOT date = NULL 
); 

查询显示的内容:

| result | date       | id |  
|--------|------------|----|  
| A      | 12.04.2020 | 42 |    
| A      | 23.02.2019 | 43 | 
| ...    | ...        | ...| 

我要显示的内容:

| result | date       | id |  
|--------|------------|----|  
| A      | 15.04.2020 | 42 |    
| A      | 25.02.2019 | 43 | 
| ...    | ...        |... |

问题:
我不想要日期“12.04.2020”,它是结果 = A 行的日期,而是“15.04.2020”,它是来自:

的日期
| B      | 15.04.2020 | 42 |  

所以,我需要在子查询中选择的日期:

(
  SELECT id 
  FROM table_1 
  -- some joins which I also hope are not relevant... 
  WHERE result LIKE '%B%' 
  AND NOT date = NULL 
)

现实世界的问题要复杂得多,但对我来说相关的部分应该与此处介绍的相同。

我该怎么做?

非常感谢您!

解法:
(感谢@markp-fuso 给出了正确和准确的答案,见下文,感谢理解我的问题的@Andy3B - 由于我的描述很糟糕 - 基本上给出了正确的答案!)
自连接。

SELECT t1.result, t2.date, t1.id 
FROM   table_1 t1 
JOIN   table_1 t2 ON t1.id = t2.id 

WHERE  t1.result LIKE '%A%' 
AND    t1.date IS NOT NULL 
AND    t2.result LIKE '%B%' 
AND    t2.date IS NOT NULL; 

空值应该使用 date IS NOT NULL 条件而不是 NOT date = NULL 进行比较。

此外,您需要日期 15.04.2020,但 where 条件 result LIKE '%A%' 与该日期的任何行都不匹配。

尝试详细描述你想要达到的目标。对于日期为 15.04.2020 的 select 行,IN 子句中的内部子查询是好的开始。

SELECT  T2.*
FROM    table_1 T1
JOIN    table_1 T2  ON  T2.ID = T1.ID

WHERE 
        T1.result   LIKE    '%A%' 
    AND T1.date     IS      NOT NULL
    AND T2.result   LIKE    '%B%' 
    AND T2.date     IS      NOT NULL 

在你的情况下,如果你在外部 select 的末尾创建一个条件 LIKE '%B%',结果将如你所愿。

否则,所有元组都具有相同的 ID,并且按 ID 进行采样在这里不起作用。

假设:

  • 对于给定的 id 值,在 result=A 处最多有 1x 行,在 result=B 处最多有 1x 行(否则 OP 需要提供更多关于哪一行的详细信息) 如果有 2+ 个匹配行,则需要)
  • 如果没有与 result=B 匹配的行,则显示 NULL(否则,如果匹配的 result=B 行不存在,OP 将需要提供更多详细信息)

我们将让主查询查找包含 result=A 的所有行,并让子查询(在 select/projection 列表中)查找包含 result=B 的匹配行,例如:

select  t1.result,
        (select max(t2.date)
         from   table_1 t2
         where  t2.id = t1.id
         and    t2.result like '%B%'
         and    t2.date is not NULL) as 'date',
        t1.id
from    table_1 t1
where   t1.result like '%A%'
and     t1.date is not NULL

注意max(t2.date)假设我们想要'latest'date如果有2+匹配行result=B;这还假定 date 列的类型为 (small)datetime


更新 Andy3B 的答案以从 2 个不同的行中提取值(查询的不同之处在于第一行,即 select/projection 列表):

SELECT  T1.result, T2.date, T1.id
FROM    table_1 T1
JOIN    table_1 T2  ON  T2.ID = T1.ID

WHERE 
        T1.result   LIKE    '%A%' 
    AND T1.date     IS      NOT NULL
    AND T2.result   LIKE    '%B%' 
    AND T2.date     IS      NOT NULL

注意:等值连接假设总是(至少)有一行 result=Bresult=A.[= 的每一行一起去26=]