sqlite3:比较同一张表中的两个单元格

时间:2019-02-11 11:14:17

标签: sqlite

我有一个这样的桌子

CREATE TABLE "modules" ( `ID` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT, `version` TEXT, `deployID` INTEGER )

我希望能够从该数据库中获取所有行,其中不同部署ID之间的版本不同。因此,假设我有一个部署ID 2和一个DeploymentID 3-我的表可能为每个部署有2000个奇数模块。我只想获取名称相同但版本不同的行。这可能吗?我以为这个查询可以做到,但似乎让我得到了一切-两次!

SELECT a.* FROM modules a 
INNER JOIN modules b 
ON a.name == b.name 
WHERE a.version != b.version 
AND a.deployID = 3 
AND b.deployID = 2 

2 个答案:

答案 0 :(得分:1)

我可能会在这里使用一个存在的查询:

#include <iostream>
#include <string>
#include <vector>

// Takes values and outputs a string vector.
std::vector<std::string> foo(const int argc, char* args[]) {
    std::vector<std::string> strings;
    for (int i = 0; i < argc; i++)
        strings.push_back(args[i]);
    return strings;
}

int main(int argc, char *args[]) {

    std::vector<std::string> strings = foo(argc, args);

    for (unsigned int i = 0; i < strings.size(); i++)
        std::cout << strings[i] << std::endl;

    return 0;
}

或者您可能想要一个更具体的版本:

SELECT m1.*
FROM modules m1
WHERE EXISTS (SELECT 1 FROM modules m2
              WHERE m1.name = m2.name AND
                    m1.deployID <> m2.deployID AND m1.version <> m2.version);

答案 1 :(得分:1)

如果您只关心deployid的{​​{1}}和2

3

如果您不需要此条件:

select m.*
from modules m
where 
  m.deployid in (2, 3)
  and
  exists (
    select 1 from modules 
    where 
      name = m.name 
      and
      deployID <> m.deployID 
      and 
      version <> m.version
  )

您可以将其删除。