Дублирующие данные SQL-- - PullRequest
0 голосов
/ 19 января 2012

У меня есть несколько операторов обтекания, которые восстанавливают целочисленные значения, и внутри операторов обтекания значения рассчитываются нормально ... Когда я хочу ВЫБРАТЬ несколько целочисленных значений из разных операторов обертки, я получаю проблему ...Дублирование отличается для каждого значения val, иногда я получаю значение, которое ТОЛЬКО в 200 раз больше, чем должно быть.

Вот как выглядит структура кода:

  SELECT
       SUM(c.val)
      ,SUM(t.val)
      ,SUM(x.val)
      ,SUM(z.val)
   FROM    
    (SELECT CASE
        WHEN ------CRITERIA FOR CODE HERE
    FROM tableName
    WHERE ...
    )c,

    (SELECT CASE
    WHEN ------CRITERIA FOR CODE HERE
    FROM tableName
    WHERE ...
    )t,

   (SELECT CASE
    WHEN ------CRITERIA FOR CODE HERE
    FROM tableName
    WHERE ...
    )x,

  (SELECT CASE
    WHEN ------CRITERIA FOR CODE HERE
    FROM tableName
    WHERE ...
    )z

Ответы [ 3 ]

0 голосов
/ 19 января 2012

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

Если вы отправите полный запрос, возможно, мы поможем вам с переписыванием.

0 голосов
/ 19 января 2012

Я думаю, что ваша база данных объединяет все результаты ваших подзапросов. Позвольте мне показать вам пример из SQLite:

sqlite> create table A(a,b);
sqlite> create table B(c,d);
sqlite> insert into B values ('1c','1d');
sqlite> insert into B values ('2c','2d');
sqlite> insert into A values ('1a','1b');
sqlite> insert into A values ('2a','2b');
sqlite> select a,b,c,d from A, B;
1a|1b|1c|1d
1a|1b|2c|2d
2a|2b|1c|1d
2a|2b|2c|2d
sqlite> select a,b from A;
1a|1b
2a|2b
sqlite> select c,d from B;
1c|1d
2c|2d

Как видите, таблицы A и B имеют две строки. Однако выберите * из A, B производит 4 строки. Это потому, что он создает каждую возможную комбинацию для строк из A и B. Поэтому, когда вы суммируете () столбцы, вы получаете такие большие результаты.

Вы можете попробовать сделать что-то вроде:

SELECT
  max(first_big_one_column_select),
  max(second_big_one_column_select),
  ...

Но я не уверен, что это сработает. Я думаю, что многое зависит от базы данных, которую вы используете.

0 голосов
/ 19 января 2012

Когда вы выполняете ваши подвыборы в предложении where таким образом, они по существу объединяют их, и это не то, что вам нужно. Если ваша часть «FROM tableName WHERE ...» каждого подвыбора идентична, выполните их в части запроса SELECT следующим образом:

SELECT
    (CASE WHEN --criteria...) as c,
    (CASE WHEN --criteria...) as t,
    (CASE WHEN --criteria...) as x,
    (CASE WHEN --criteria...) as z
FROM tableName
WHERE ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...