Проверьте фиктивный столбец и верните правильные данные - PullRequest
0 голосов
/ 25 февраля 2020

Имея этот выбор:

  SELECT * (SELECT id, value, discount, 2 AS attr_number FROM database1 db1
      JOIN database2 db2 ON db2.db1_id = db1.id
    WHERE value = 1
    UNION
    SELECT id, value, discount, 1 AS attr_number FROM database1 db1
      JOIN database4 db4 ON db4.db1_id = db1.id
      AND db4.value = 1
    WHERE value = 1) WHERE id = 225

Это то, что я получаю при выполнении выбора:

|ID           |VALUE                                  |DISCOUNT                               |ATTR_NUMBER                            |
|-------------|---------------------------------------|---------------------------------------|---------------------------------------|
|225          |1                                      |50                                     |2                                      |
|225          |1                                      |50                                     |2                                      |
|225          |1                                      |40                                     |1                                      |
|225          |1                                      |40                                     |1                                      |
|225          |1                                      |40                                     |1                                      |

Мне нужно добавить проверку для столбца attr_number. Если у select есть записи, где attr_number = 1, то выходные данные должны быть такими (он должен возвращать только записи, где attr_number = 1):

|ID           |VALUE                                  |DISCOUNT                               |ATTR_NUMBER                            |
|-------------|---------------------------------------|---------------------------------------|---------------------------------------|
|225          |1                                      |40                                     |1                                      |
|225          |1                                      |40                                     |1                                      |
|225          |1                                      |40                                     |1                                      |

Если у select нет записей, где attr_number = 1, тогда он должен вернуть записи, где attr_number = 2. Например:

|ID           |VALUE                                  |DISCOUNT                               |ATTR_NUMBER                            |
|-------------|---------------------------------------|---------------------------------------|---------------------------------------|
|225          |1                                      |50                                     |2                                      |
|225          |1                                      |50                                     |2                                      |

Значения attr_number могут быть только 1 или 2.

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Я думаю, вы описываете предложение NOT EXISTS:

WITH a1 as (
      SELECT id, value, discount, 2 AS attr_number
      FROM database1 db1 JOIN
           database2 db2
           ON db2.db1_id = db1.id
      WHERE id = 225 AND value = 1
    )
SELECT a1.*
FROM a1
UNION ALL
SELECT id, value, discount, 1 AS attr_number
FROM database1 db1 JOIN
      database4 db4
      ON db4.db1_id = db1.id
WHERE id = 225 AND
      db4.value = 1 AND
      NOT EXISTS (SELECT 1 FROM a1);
1 голос
/ 25 февраля 2020

Я не совсем понимаю, что вы ищете, но я думаю, что я достаточно близко:

SELECT * 
(
  SELECT id, value, discount, 1 AS attr_number 
  FROM database1 db1
  JOIN database4 db4 ON db4.db1_id = db1.id AND db4.value = 1
  WHERE db4.value = 1 

  UNION ALL

  SELECT id, value, discount, 2 AS attr_number 
  FROM database1 db1
  JOIN database2 db2 ON db2.db1_id = db1.id
  LEFT JOIN database4 db4 ON db4.db1_id = db1.id AND db4.value = 1
  WHERE db2.value = 1 and db4.value is NULL
) 
WHERE id = 225 

Атт # 1 не требует каких-либо условий, поскольку он получает первый приоритет. Для Att # 2 я добавил еще одно условие, чтобы проверить, имеет ли Att # 1 значение. Надеюсь, это поможет.

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