基于两列 SQL 搜索数据

Posted

技术标签:

【中文标题】基于两列 SQL 搜索数据【英文标题】:Search data based on two columns SQL 【发布时间】:2020-05-04 06:00:17 【问题描述】:

我有一个这样的数据库表:

Id          Tipo        Provincia
RTOR-0246   INVENTARIO  MADRID
RTOR-0246   SUSTRATO    MADRID
RTOR-0247   INVENTARIO  MADRID
RTOR-0252   INVENTARIO  MADRID
RTOR-0255   SUSTRATO    MADRID
RTOR-0261   SUSTRATO    MADRID

我需要从 ID 中搜索没有 Tipo = Inventario 的 ID 并使用该数据创建一个新行,例如,RTOR-00261 和 RTOR-0255 没有 INVENTARIO,我需要使用以下字段创建新的SUSTRATO 有。所有数据都在同一张表中

最终输出如下:

Id          Tipo        Provincia
RTOR-0246   INVENTARIO  MADRID
RTOR-0246   SUSTRATO    MADRID
RTOR-0247   INVENTARIO  MADRID
RTOR-0252   INVENTARIO  MADRID
RTOR-0255   SUSTRATO    MADRID
RTOR-0261   SUSTRATO    MADRID
RTOR-0255   INVENTARIO  MADRID
RTOR-0261   INVENTARIO  MADRID

我试过了:

SELECT Id 
FROM my_table 
WHERE NOT EXISTS (SELECT NULL FROM my_table WHERE id != id)

没用

其他:

SELECT Id 
FROM my_table as t1
WHERE NOT EXISTS (SELECT Administrativo FROM my_table where Tipo='INVENTARIO') as sq
where T t1.Tipo='SUSTRATO' and t1.Id=sq.Id

也不行。

我需要这方面的帮助 - 有什么想法吗?

【问题讨论】:

您使用的是 mysql 还是 MS SQL Server? 【参考方案1】:

这两个解决方案有效(您非常接近):

使用子查询:

SELECT `Id` 
FROM `my_table`
WHERE NOT EXISTS (SELECT 1 FROM `my_table` AS `sub` WHERE `sub`.`Id` = `my_table`.`Id` AND `sub`.`Tipo` = 'INVENTARIO');

左连接:

SELECT `my_table`.`Id` 
FROM `my_table` LEFT JOIN
`my_table` AS `Inventario` ON (`Inventario`.`Id` = `my_table`.`Id` AND `Inventario`.`Tipo` = 'INVENTARIO')
WHERE `Inventario`.`Id` IS NULL;

DB Fiddle

编辑:我也认为问题应该有所不同。更像是“如何在同一个表中选择与条件不匹配的行”左右。 “基于两列搜索数据”的问题过于宽泛,可以用“WHERE ... AND ...”来回答。

【讨论】:

【参考方案2】:

对于这 2 种情况,您需要 UNION ALL 并且不存在:

SELECT Id, Tipo, Provincia 
FROM my_table 
UNION ALL
SELECT m.Id, 'INVENTARIO', m.Provincia
FROM my_table m
WHERE Tipo = 'SUSTRATO'
AND NOT EXISTS (
  SELECT 1 FROM my_table 
  WHERE id = m.id AND Tipo = 'INVENTARIO'
)

请参阅demo。 结果:

| Id        | Tipo       | Provincia |
| --------- | ---------- | --------- |
| RTOR-0246 | INVENTARIO | MADRID    |
| RTOR-0246 | SUSTRATO   | MADRID    |
| RTOR-0247 | INVENTARIO | MADRID    |
| RTOR-0252 | INVENTARIO | MADRID    |
| RTOR-0255 | SUSTRATO   | MADRID    |
| RTOR-0261 | SUSTRATO   | MADRID    |
| RTOR-0255 | INVENTARIO | MADRID    |
| RTOR-0261 | INVENTARIO | MADRID    |

【讨论】:

谢谢...但不起作用,我有这个问题错误代码:1222。使用的 SELECT 语句有不同的列数;我有大约 20 列,我只放了 3 列作为示例。我该如何解决?为什么你把m。在列之前,但不在列 Tipo?? 您在问题中说您想使用 Tipo = Inventario 添加行,就像您的最终输出一样:对吗?但是您接受了仅返回 id 的答案。如果您只想要 Id 列,您应该澄清这一点。如果您只想要 3 列而不是 select * ...,您可以这样做:select Id, Tipo, Provincia .... 而 m 是子查询中表的别名。

以上是关于基于两列 SQL 搜索数据的主要内容,如果未能解决你的问题,请参考以下文章

基于两列值的sql排序

SQL Server:基于两列返回特殊计数列

SQL:ORDER BY 两列混合,不基于优先级

如何基于两列组合两个数据框? [复制]

无法基于两列旋转 C# 数据表

使用 apply() 基于函数创建两列