sqlite3: сравнить две ячейки из одной таблицы - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть такая таблица

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

Я хочу иметь возможность получить все строки из этой базы данных, где версия отличается для разных идентификаторов развертывания.Итак, скажем, у меня есть ID развертывания 2 и deployID 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 голосов
/ 11 февраля 2019

Если вы заботитесь только о deployid s 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
  )

Если вам не нужно это условие:

deployID <> m.deployID

вы можете удалитьэто.

0 голосов
/ 11 февраля 2019

Я бы, вероятно, использовал бы здесь существующий запрос:

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);

Или, может быть, вам нужна более конкретная версия:

SELECT m1.*
FROM modules m1
WHERE EXISTS (SELECT 1 FROM modules m2
              WHERE m1.name = m2.name AND
                    LEAST(m1.deployID, m2.deployID) = 2 AND
                    GREATEST(m1.deployID, m2.deployID) = 3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...