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=B
与 result=A
.[= 的每一行一起去26=]
已解决(见下文)
我有以下 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=B
与 result=A
.[= 的每一行一起去26=]