【问题标题】:SQLite with inner select带有内部选择的 SQLite
【发布时间】:2014-01-29 04:24:45
【问题描述】:

我需要根据下表架构构造一个 SQLite 语句。 ParentEventInfoID 映射到同一个表中的其他项目。

表名事件信息: _id、名称、描述、ParentEventInfoID、SortId

查询的部分要求需要在名称和描述上执行 where 子句,我对此没有问题:

SELECT * FROM EventInfo 
   Where Name LIKE "%search text%" OR 
         Description LIKE "%search text%" 
ORDER BY SortId;

我遇到的问题是我还需要包含条目的父项。以下是返回 LIKE 的所有匹配项的语句,但即使我知道我应该有更多,但只有一个父项:

SELECT * FROM EventInfo 
    Where Name LIKE "%search text%" OR 
          Description LIKE "%search text%" OR 
          _id = (SELECT ParentEventInfoID FROM EventInfo
                   Where (Name LIKE "%search text%" OR 
                          Description LIKE "%search text%") 
ORDER BY SortId

我已经有一段时间没有做大量的 SQL 了,我感觉很生疏。任何帮助是极大的赞赏。谢谢!

【问题讨论】:

  • 将_id后面的=替换为IN
  • @MillerKoijam 成功了!你认为这是最有效的构建方式吗?
  • 应该有更好的查询。我认为我们可以避免在内部查询中使用 like 子句,因为我们正在访问同一张表
  • 是的,那是我不喜欢的部分。显得多余。但与此同时,您的解决方案让它对我有用。如果您想将其作为答案,我会接受吗?

标签: sql database sqlite select


【解决方案1】:

试试这个

SELECT * FROM EventInfo 
    Where Name LIKE "%search text%" OR 
          Description LIKE "%search text%" OR 
          _id IN (SELECT ParentEventInfoID FROM EventInfo
                   Where (Name LIKE "%search text%" OR 
                          Description LIKE "%search text%") 
ORDER BY SortId

但是应该有更好的查询来避免内部查询中的like子句。

【讨论】:

  • 完美。谢谢您的帮助。我想找到一个更有效的陈述,但这让我继续前进。再次感谢!
【解决方案2】:

你可以使用 SELF JOINS

SELECT E1.* FROM EventInfo E1
LEFT JOIN EventInfo E2
ON E1._id =E2.ParentEventInfoID 
Where Name LIKE "%search text%" OR 
      Description LIKE "%search text%" OR  
ORDER BY E1.SortId

【讨论】:

  • 感谢您的快速回复。我刚试过这个,结果和我的第一个语句一样,没有内部选择。
猜你喜欢
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多