从元组中的IN子句的SQLite /语法加入中删除?

时间:2015-05-22 12:40:51

标签: sqlite

我有一个使用复合主键存储用户和相关数据的模式,如下所示:

CREATE TABLE users (
    domain integer,
    userid integer,
    ...
    PRIMARY KEY (domain, userid)
);

CREATE TABLE userdata (
    domain integer,
    userid integer,
    key    integer,
    ...
    PRIMARY KEY (domain, userid, key),
    FOREIGN KEY (domain, userid) REFERENCES users(domain, userid)
);

我无法对此架构进行更改,也无法选择使用其他DBMS。

我想根据用户的标准删除userdata中的某些行。从概念上讲,我喜欢做类似的事情:

DELETE FROM userdata
WHERE (domain, userid) IN (
    SELECT domain, userid FROM users WHERE <some condition>
) AND key = some_constant;

或者

DELETE ud FROM userdata ud
INNER JOIN users u on u.domain = ud.domain and u.userid = ud.userid
WHERE <some condition over u>
AND ud.key = some_constant

但是sqlite3(3.8.2)拒绝这两种形式,前者用

Error: near ",": syntax error

和后者

Error: near "ud": syntax error

令人讨厌的是,当连接键由单个列组成时,IN语法非常有效。

实现此目的的正确语法或技术是什么?

3 个答案:

答案 0 :(得分:1)

我假设您要从user_data和用户的x,y,z条件中删除密钥。

<div id="PaginaDrieTatjana" style="display:none;">
  <h1>Kies soort dans</h1>

  <div id="Rock">
    <h3>Rock Dance</h3>
    <img src="Tatjana/Een.jpg" style="width: 100%;">
    <div id="RockButton">
        <p>Kiezen</p>
    </div>
  </div >

  <div id="Pop">
    <h3>Pop Dance</h3>
    <img src="Tatjana/Twee.jpg" style="width: 100%;">
    <div id="PopButton">
        <p>Kiezen</p>
    </div>

  </div>

答案 1 :(得分:1)

您的第一次尝试不起作用,因为SQLite不支持元组(或其他任何名称)(支持的语法here)。

你的第二次尝试是无效语法,因为DELETE语句中没有JOIN(可能是某些DBMS引入的扩展,但显然不是SQL92)。

您可以尝试的是:

DELETE FROM userdata
WHERE domain IN (SELECT u.domain FROM users u WHERE <some condition>)
  AND userid IN (SELECT u.userid FROM users u WHERE <some condition> AND domain = u.domain)
  AND key = some_constant;

答案 2 :(得分:0)

不是SQLite用户,但我尝试在userdata中选择要删除的ROWID。我的意思是

delete from userdata
where rowid in (
    select ud.rowid
    from userdata ud
    join users u on ...
    where condition
)