Как сделать этот запрос Android SQLite присоединиться - PullRequest
0 голосов
/ 01 марта 2012

SQL-соединения никогда не были моей силой. Я хотел бы помочь с этим. Это, вероятно, простой для вас маэстро SQL.

У меня есть 2 таблицы с одинаковыми столбцами. Скажем, их структура:

id INTEGER PRIMARY KEY AUTOINCREMENT,
key INTEGER,
description TEXT NOT NULL,
size INTEGER,
timestamp LONG,
is_on INTEGER

Имена таблиц: Рубашки1 и Рубашки2 . Таблицы представляют 2 версии набора данных и имеют большое количество перекрывающихся данных. Цель состоит в том, чтобы найти, какие строки отличаются. ключ - это ключ, который остается неизменным от версии к версии. Оставшиеся столбцы могут измениться с версии 1 на 2.

Ответы должны быть идеально для SQLite на Android. Несколько запросов в порядке - не обязательно должен быть 1 запрос.

Мое предположение

SELECT * FROM Shirts1, Shirts2 WHERE Shirts1.key=Shirts2.key AND 
        (Shirts1.description != Shirts2.description OR 
        (Shirts1.size != Shirts2.size OR
        (Shirts1.timestamp != Shirts2.timestamp OR
        (Shirts1.is_on != Shirts2.is_on)

Еще одна проблема - вызовет ли такой запрос проблемы с телефоном Android с ограниченной памятью устройства? В обеих таблицах 1000 строк. Должен ли я разбить запрос на несколько запросов, ограничив, например, сравнение до 100 строк одновременно, так как ключ идет от 1 до 1000 по порядку.

1 Ответ

0 голосов
/ 01 марта 2012

Shirt1:

1;1;"green_shirt";1;1;1
4;4;"yellow_shirt";1;1;1

Shirt2:

1;1;"green_shirt";1;1;1
2;2;"red_shirt";1;1;1
3;3;"orange_shirt";1;1;1



SELECT shirt2.*
  FROM shirt1
  RIGHT OUTER JOIN shirt2 ON shirt1.key = shirt2.key
 WHERE shirt1.description != shirt2.description OR
       IFNULL(shirt1.size, -1) != IFNULL(shirt2.size, -1) OR
       IFNULL(shirt1.timestamp, -1) != IFNULL(shirt2.timestamp, -1) OR
       IFNULL(shirt1.is_on, -1) != IFNULL(shirt2.is_on, -1)      
 UNION ALL
SELECT shirt1.*
  FROM shirt2
 RIGHT JOIN shirt1 ON shirt1.key = shirt2.key
 WHERE shirt1.description != shirt2.description OR
       IFNULL(shirt1.size, -1) != IFNULL(shirt2.size, -1) OR
       IFNULL(shirt1.timestamp, -1) != IFNULL(shirt2.timestamp, -1) OR
       IFNULL(shirt1.is_on, -1) != IFNULL(shirt2.is_on, -1)
 UNION ALL
SELECT shirt1.*
  FROM shirt1
 INNER JOIN shirt2 ON shirt1.key = shirt2.key
 WHERE shirt1.description = shirt2.description OR
       IFNULL(shirt1.size, -1) = IFNULL(shirt2.size, -1) OR
       IFNULL(shirt1.timestamp, -1) = IFNULL(shirt2.timestamp, -1) OR
       IFNULL(shirt1.is_on, -1) = IFNULL(shirt2.is_on, -1)

Выход:

2;2;"red_shirt";1;1;1
3;3;"orange_shirt";1;1;1
4;4;"yellow_shirt";1;1;1
1;1;"green_shirt";1;1;1

Если вы хотите исключить рубашки, которые включены в рубашку1 / рубашка2, вам просто нужно удалить последний союз. Это значит

SELECT shirt2.*
  FROM shirt1
  RIGHT OUTER JOIN shirt2 ON shirt1.key = shirt2.key
 WHERE shirt1.description != shirt2.description OR
       IFNULL(shirt1.size, -1) != IFNULL(shirt2.size, -1) OR
       IFNULL(shirt1.timestamp, -1) != IFNULL(shirt2.timestamp, -1) OR
       IFNULL(shirt1.is_on, -1) != IFNULL(shirt2.is_on, -1)      
 UNION ALL
SELECT shirt1.*
  FROM shirt2
 RIGHT JOIN shirt1 ON shirt1.key = shirt2.key
 WHERE shirt1.description != shirt2.description OR
       IFNULL(shirt1.size, -1) != IFNULL(shirt2.size, -1) OR
       IFNULL(shirt1.timestamp, -1) != IFNULL(shirt2.timestamp, -1) OR
       IFNULL(shirt1.is_on, -1) != IFNULL(shirt2.is_on, -1)

Выход:

2;2;"red_shirt";1;1;1
3;3;"orange_shirt";1;1;1
4;4;"yellow_shirt";1;1;1

Думаю, вы захотите, чтобы все было в одной колонке, поэтому я думаю, что это должно быть лучшим решением. Если вы согласны с наличием разных столбцов для shirt1 / shirt2, вы также можете использовать select * и игнорировать объединение.

Вопрос об устройстве: зависит от устройства, но если устройство старое, то я не думаю, что запрос будет вашей основной проблемой. Вы также можете попробовать добавить несколько индексов для повышения производительности.

Редактировать: изменено решение для присоединения к ключевому столбцу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...