如何在选择中只留下那些在一行上匹配的值?

How to leave in the selection only those values that match on one line?

有一个table存储卡的信息。

id_card, card_number, card_value

当客户发卡时,他有一个选择:数字卡或塑料数字卡

发行数字卡时,card_value变为=621

发行塑料数字卡时,card_value写入2行621和622

622 - 塑料卡

任务是只显示数字卡片,card_value = 621

但是当我select没有塑料的数字卡(621)时,数字卡和有塑料的数字卡都包含在selection中。

这是合乎逻辑的,因为该字段的值实际上包含621和622。

但是如果同时找到621和622,如何做到不在selection中显示记录呢?

我想这可以通过一些额外的列来实现,例如 id_card,但我怀疑这是正确的。

我用SQL(ORACLE 12)

如果 621, 622 可以在同一字段中,则:

WHERE card_value NOT LIKE '%622%

如果它们是单独的行,我将假设每个 client 都有一个唯一标识符,因为 OP 中没有样本数据。

SELECT *
FROM t1
WHERE unique_client_id NOT IN (SELECT unique_client_id FROM t1 where card_value = 622)   

假设 card_number 对于 621622 行都是相同的,那么:

SELECT id_card,
       card_number,
       card_value
FROM   (
  SELECT t.*,
         MAX(card_value) OVER (PARTITION BY card_number) AS max_card_value
  FROM   table_name t
  WHERE  card_value IN (621, 622)
)
WHERE  max_card_value = 621;

其中,对于示例数据:

CREATE TABLE table_name (id_card, card_number, card_value) AS
SELECT 1, 11111, 621 FROM DUAL UNION ALL
SELECT 2, 22222, 621 FROM DUAL UNION ALL
SELECT 3, 22222, 622 FROM DUAL UNION ALL
SELECT 4, 33333, 621 FROM DUAL UNION ALL
SELECT 5, 33333, 555 FROM DUAL UNION ALL
SELECT 6, 44444, 621 FROM DUAL UNION ALL
SELECT 7, 44444, 622 FROM DUAL;

输出:

ID_CARD CARD_NUMBER CARD_VALUE
1 11111 621
4 33333 621

db<>fiddle here