我有一个使用复合主键存储用户和相关数据的模式,如下所示:
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
语法非常有效。
实现此目的的正确语法或技术是什么?
答案 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
)