首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL:查询在一个字段中查找具有公共值的多个项

SQL:查询在一个字段中查找具有公共值的多个项
EN

Stack Overflow用户
提问于 2021-04-25 18:31:42
回答 1查看 166关注 0票数 0

我有一个数据库,其结构如下:

代码语言:javascript
复制
UserInfo
----------
Id (INT PK AI)
UserId (INT)
InfoTypeId (INT FK -> InfoType.Id)
Value (varchar)

InfoType
----------
Id (INT PK AI)
InfoTypeName (VARCHAR)

行表示给定用户的信息。例如,InfoType表中可能有以下行:

代码语言:javascript
复制
Id | InfoTypeName
-----------------
1  | "First Name"
2  | "Last Name"
3  | "Age"

UserInfo中的行如下所示:

代码语言:javascript
复制
Id | UserId | InfoTypeId | Value
--------------------------------
1  | 1      | 1          | "John"
2  | 1      | 2          | "Smith"
3  | 1      | 3          | "20"
4  | 2      | 1          | "John"
5  | 2      | 2          | "Doe"
6  | 2      | 3          | "30"
7  | 3      | 1          | "Jane"
8  | 3      | 2          | "Doe"
9  | 3      | 3          | "25"
10 | 4      | 1          | "John"
11 | 4      | 2          | "Smith"
12 | 4      | 3          | "25"

我想要创建一个查询,从UserInfo表中删除引用名为"John“而姓"Smith”的用户的所有行。这意味着我想要删除第1、2、3、10、11和12行。

编辑:

我能够获得一个用户I列表

代码语言:javascript
复制
SELECT DISTINCT ui1.UserId 
FROM UserInfo ui1
    INNER JOIN UserInfo ui2 
    ON ui1.UserId = ui2.UserId
WHERE (ui1.InfoTypeId = 1 AND ui1.Value = "John" AND ui2.InfoTypeId = 2 AND ui2.Value = "Smith");

此外,还要删除的行列表。

代码语言:javascript
复制
SELECT * FROM UserInfo ui WHERE ui.UserId IN
    (SELECT DISTINCT ui1.UserId 
    FROM UserInfo ui1
        INNER JOIN UserInfo ui2 
        ON ui1.UserId = ui2.UserId
    WHERE (ui1.InfoTypeId = 1 AND ui1.Value = "John" AND ui2.InfoTypeId = 2 AND ui2.Value = "Smith"));

但是,当我将SELECT替换为这样的DELETE时:

代码语言:javascript
复制
DELETE FROM UserInfo WHERE UserId IN
    (SELECT DISTINCT ui1.UserId 
    FROM UserInfo ui1
        INNER JOIN UserInfo ui2 
        ON ui1.UserId = ui2.UserId
    WHERE (ui1.InfoTypeId = 1 AND ui1.Value = "John" AND ui2.InfoTypeId = 2 AND ui2.Value = "Smith"));

我得到了

代码语言:javascript
复制
SQL Error [1093] [HY000]: You can't specify target table 'UserInfo' for update in FROM clause
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-25 18:54:47

您可以在这里使用join

代码语言:javascript
复制
delete ui
    from UserInfo ui join
         (select ui.UserId,
                 max(case when it.InfoTypeName = 'First name' then value end) as first_name,
                 max(case when it.InfoTypeName = 'Last name' then value end) as last_name
          from UserInfo ui join
               InfoType it
               on ui.InfoTypeId = it.id
          group by ui.UserId
         ) uu
         using (UserId)
    where uu.first_name = 'John' and uu.last_name = 'Smith';
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67256919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档