像 COALESCE 之类的复杂查询?
Something like COALESCE for complicated query?
假设我有一个表 1:
column1|column2|state|
-------|-------|-----|
test1 | 2| 0|
test1 | 3| 0|
test1 | 1| 1|
test2 | 2| 1|
test2 | 1| 2|
我想 select(实际上是删除,但我使用 select 进行测试)所有不具有唯一 column1
且不 select 的列(实际保留)仅具有以下行:
- state = 0 和 column2 中的最小值,
- 如果不存在 state = 0 的行,则为 column2 中具有最小值的行。
所以 select 的结果应该是:
column1|column2|state|
-------|-------|-----|
test1 | 3| 0|
test1 | 1| 1|
test2 | 2| 1|
保留的行(在删除的情况下)应该是:
column1|column2|state|
-------|-------|-----|
test1 | 2| 0|
test2 | 1| 2|
我试图通过以下方式实现它(不起作用):
SELECT * FROM table1 AS result1
WHERE
result1.column1 IN
(SELECT
result2.column1
FROM
table1 AS result2
WHERE /*part that works*/)
AND
result1.column2 >
(SELECT
min(result3.column2)
FROM
table1 AS result3
WHERE (COALESCE(
result3.column1 = result1.column1
AND
result3.state = 0,
WHERE
result3.column1 = result1.column1
)))
我想不通的部分在后面result1.column2 >
。
我想比较 result1.column2
和
的结果
- 结果集中的最小值,其中
it3.state = 0
、
- 如果 1. 不存在,则使用没有
it3.state = 0
条件的类似结果集中的最小值。
这是我的问题,我希望它是有道理的。也许可以用更 efficient/neater 的方式完全重写。
你能帮我解决这个问题吗?
这是你想要的吗?
SELECT
*
FROM
table1 AS result1
WHERE
result1.column1 IN (SELECT result2.column1
FROM table1 AS result2
WHERE /*part that works*/)
AND result1.column2 > COALESCE( ( SELECT min(result3.column2)
FROM table1 AS result3
WHERE result3.column1 = result1.column1
AND result3.state = 0 )
,( SELECT min(result3.column2)
FROM table1 AS result3
WHERE result3.column1 = result1.column1 )
)
;
假设我有一个表 1:
column1|column2|state|
-------|-------|-----|
test1 | 2| 0|
test1 | 3| 0|
test1 | 1| 1|
test2 | 2| 1|
test2 | 1| 2|
我想 select(实际上是删除,但我使用 select 进行测试)所有不具有唯一 column1
且不 select 的列(实际保留)仅具有以下行:
- state = 0 和 column2 中的最小值,
- 如果不存在 state = 0 的行,则为 column2 中具有最小值的行。
所以 select 的结果应该是:
column1|column2|state|
-------|-------|-----|
test1 | 3| 0|
test1 | 1| 1|
test2 | 2| 1|
保留的行(在删除的情况下)应该是:
column1|column2|state|
-------|-------|-----|
test1 | 2| 0|
test2 | 1| 2|
我试图通过以下方式实现它(不起作用):
SELECT * FROM table1 AS result1
WHERE
result1.column1 IN
(SELECT
result2.column1
FROM
table1 AS result2
WHERE /*part that works*/)
AND
result1.column2 >
(SELECT
min(result3.column2)
FROM
table1 AS result3
WHERE (COALESCE(
result3.column1 = result1.column1
AND
result3.state = 0,
WHERE
result3.column1 = result1.column1
)))
我想不通的部分在后面result1.column2 >
。
我想比较 result1.column2
和
- 结果集中的最小值,其中
it3.state = 0
、 - 如果 1. 不存在,则使用没有
it3.state = 0
条件的类似结果集中的最小值。
这是我的问题,我希望它是有道理的。也许可以用更 efficient/neater 的方式完全重写。
你能帮我解决这个问题吗?
这是你想要的吗?
SELECT
*
FROM
table1 AS result1
WHERE
result1.column1 IN (SELECT result2.column1
FROM table1 AS result2
WHERE /*part that works*/)
AND result1.column2 > COALESCE( ( SELECT min(result3.column2)
FROM table1 AS result3
WHERE result3.column1 = result1.column1
AND result3.state = 0 )
,( SELECT min(result3.column2)
FROM table1 AS result3
WHERE result3.column1 = result1.column1 )
)
;