基于两列 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 搜索数据的主要内容,如果未能解决你的问题,请参考以下文章