Этот выбор используется как left outer join
в пакете:
SELECT * (SELECT db1.id, db2.value, db1.discount, 2 AS attr_number FROM database1 db1
JOIN database2 db2 ON db2.db1_id = db1.id
WHERE db2.value = 1
UNION
SELECT db1.id, db4.value, db1.discount, 1 AS attr_number FROM database1 db1
JOIN database4 db4 ON db4.db1_id = db1.id
WHERE db4.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
и извлекать записи на основе этого поля.
Как видите, значение строки attr_number
может быть только 1 или 2.
В этом примере записи существуют с обоими значениями, в данном случае нам нужно возвращать только туда, где attr_number = 1
(потому что он существует), так что это пример того, что он должен вернуть:
|ID |VALUE |DISCOUNT |ATTR_NUMBER |
|-------------|------------------|------------------|------------------|
|225 |1 |40 |1 |
|225 |1 |40 |1 |
|225 |1 |40 |1 |
Как видите, он «удалил» записи, где attr_number = 2
и вернул только там, где это 1.
В другом случае, если select не возвращает записи, где attr_number = 1
, он возвращает все остальные записи, в этом случае это будет где attr_number = 2
. Вот пример того, что он должен вернуть в этом случае:
|ID |VALUE |DISCOUNT |ATTR_NUMBER |
|-------------|------------------|------------------|------------------|
|225 |1 |50 |2 |
|225 |1 |50 |2 |
Надеюсь, мои объяснения достаточно ясны.