【发布时间】:2012-12-12 22:18:11
【问题描述】:
我想创建一个重用 select 语句结果的 SQL 语句(使用 sqllite.. 所以我不能使用函数、IF 语句等).. 这就是它目前的样子
INSERT INTO search_email(many_fields, threadid) VALUES ('many_fields',
CASE
WHEN
(
(SELECT COUNT(tableX.threadid) %threadIDquery%
) > 0
)
THEN
(SELECT tableX.threadid %threadIDquery% LIMIT 1)
ELSE
0
END
)
我想重用第一次选择的结果,而不是必须创建另一个(几乎相同的)选择语句。
更新: 对于那些想知道我要做什么的人。这里是查询的完整版本:
INSERT INTO search_email(meta, subject, body, sender, tos, ccs, folder, threadid) VALUES ('meta1','subject1','body1','sender1', 'tos1',' ccs1','folder1',
CASE
WHEN
(
(SELECT COUNT(search_email.threadID) FROM search_email
WHERE search_email.subject MATCH '%query%' AND
(
(search_email.sender = '%sender' AND search_email.tos = '%receiver%')
OR
(search_email.sender = '%receiver%' AND search_email.tos = '%sender%')
)
) > 0
)
THEN
(SELECT search_email.threadID FROM search_email
WHERE search_email.subject MATCH '%query%' AND
(
(search_email.sender = '%sender%' AND search_email.tos = '%receiver%')
OR
(search_email.sender = '%receiver%' AND search_email.tos = '%sender%')
) LIMIT 1
)
ELSE
//generate new thread ID
END
)
基本上,我试图找出是否已经存在接收电子邮件的电子邮件线程。所以我检查主题是否匹配,如果匹配,我检查电子邮件的发件人和收件人是否匹配(在任一方向).. 如果电子邮件线程存在,我只需插入相同的电子邮件线程 ID,否则我生成一个新的线程 ID
更新 2:澄清一下,我正在寻找一种方法来避免 sqllite 编译器进行两次相同的搜索.. 而不是简单地节省打字(或使其更具可读性等) )
更新 3: 我想知道如果 threadID 是从 dbase 中检索到的,而不是生成的,此语句是否有办法返回生成的 threadID。你可以找到答案 @987654321 @
【问题讨论】:
-
这是在做什么?我可以看到您的答案如何设法解析数据,但我认为它实际上并没有满足您的需求。
-
更新问题以解决您的评论
-
是 SQL Server 还是 SQLite?您知道,即使您确实设法保存了两次查询的输入,查询也会运行两次并产生可能不同的结果,对吧?
-
SQLlite .. 嗯.. 我显然对节省打字不感兴趣.. 我希望有更便宜的东西.. 一定有办法!
标签: sql sql-server sqlite