c++ - 如何组合两个查询并将第一个查询的结果用作第二个查询的输出

标签 c++ sqlite

表格

我有以下表格:

 entite              var_entite                 variation
ID | NAME        ID_entite|id_var                ID | NAME
1  | x1            1      |    1                  1 | y1
2  | x2            1      |    2                  2 | y2
3  | x3            1      |    3                  3 | y3
                   2      |    1                  4 | y4
                   2      |    4                  5 | y5
                   3      |    2
                   3      |    5

架构

CREATE TABLE ENTITE (ID PRIMARY KEY NOT NULL, NAME STRING)

CREATE TABLE VAR_ENTITE(ID_ENTITE INTEGER NOT NULL, 
                        ID_VARIATION INTEGER NOT NULL, 
                        FOREIGN KEY (ID_ENTITE) REFERENCES ENTITE(ID),
                        FOREIGN KEY (ID_VARIATION) REFERENCES VARIATIONS(ID);

CREATE TABLE VARIATIONS (ID PRIMARY KEY NOT NULL, NAME STRING)

问题

我正在使用 sqlite3 . ?表示输入变量。

1- 对于每个实体 x在表中entite我们要选择它的变体 y

SELECT e.id, e.name, v.name FROM var_entite ve 
       JOIN entite as e ON e.id_entite = ve.id_entite 
       JOIN variations as v ON v.id = ve.id_var;

2- 对于之前查询中的每个选择实体,我们选择具有相同变体的所有rest实体。

SELECT e.id, e.name, v.name FROM var_entite ve 
       JOIN entite as e ON e.id = ve.id 
       JOIN variations as v ON v.id = ve.id_var
       where e.id <> ? and v.name =? ;
  • e.id_entite <> ?对于与查询 1 具有不同实体的其余实体

  • v.name =?如果一个实体与 1 中返回的实体具有相同的变体,那么我们选择它

我的问题如下:

  • 我们如何组合这两个查询以获得相同的结果?
  • 如果我们合并查询,查询会变得更快吗?

例子

查询 1:

1,x1,y1
1,x1,y2
1,x1,y3
2,x2,y1
2,x2,y4
3,x3,y2
3,x3,y5

id = 1 的实体查询 2 个输出

    2,x2,y1
    3,x3,y2

id = 2

实体的查询 2 输出
    1,x1,y1
    etc.

最佳答案

可以通过使用子查询来重用查询的结果。

在这种情况下,子查询不需要任何名称,因此不需要进行任何连接:

SELECT e.id, e.name, v.name
FROM var_entite ve
   JOIN entite as e ON e.id = ve.id_entite
   JOIN variations as v ON v.id = ve.id_variation
WHERE e.id <> ?
  AND v.id IN (SELECT id_variation
               FROM var_entite
               WHERE id_entite = ?)

关于c++ - 如何组合两个查询并将第一个查询的结果用作第二个查询的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32332193/

相关文章:

sqlite - Sencha Touch 2 - Ext.device.SQLite.Database 工作?

android - 尝试从 android 中的 sqlite 数据库中删除行时出现磁盘已满异常

c++ - 有效使用带有两个元素的 CRTP std::variant,但不能再多了

c++ - 从 STL 复制函数以打印出 vector

c# - SQLite.Interop.dll 的 DllNotFoundException(C# 和 SQLite)

Android:为 MySQL 和 SQLite 数据库设计

php - PDO准备语句来存储html内容

c++ - 用精神解析成类?

c++ - 比较 2 个字节数组的函数

c++ - 虚继承中的重载虚函数