Пример использования, когда нужно разделить один столбец на множество, игнорируя нулевые значения - PullRequest
0 голосов
/ 05 декабря 2018

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

У меня есть значения настраиваемых полей, которые содержатся в одной таблице и столбце, каждое настраиваемое поле получает свой собственный идентификатор, носохраненное значение находится в одном столбце.

Я пытаюсь получить 1 столбец для каждого настраиваемого поля с соответствующим значением, вот мой запрос:

SELECT PRODUCT.id AS ProductId, PRODUCT.num AS ProductNumber, 
CASE WHEN customvarcharlong.customfieldid = '6' THEN customvarcharlong.info 
END AS OEM1Name, 
CASE WHEN customvarcharlong.customfieldid = '7' THEN customvarcharlong.info 
END AS OEM1NumbersA
FROM product
JOIN customvarcharlong ON product.id=customvarcharlong.recordid
JOIN customfield ON customvarcharlong.customfieldid=customfield.id
WHERE PRODUCT.activeFlag = TRUE
ORDER BY PRODUCT.id

Моя проблема заключается в том, что я получаюстрока для каждого настраиваемого поля, у которого есть значение, и оператор case просто возвращает NULL для каждого, не совпадающего с customfieldid.

2   00007   NULL    NULL
2   00007   NULL    NULL
2   00007   NULL    NULL
2   00007   NULL    NULL
2   00007   NULL    NULL
2   00007   Comp1   NULL
2   00007   NULL    1234
2   00007   NULL    NULL
2   00007   NULL    NULL

Вот мой желаемый результат:

2   00007   Comp1   1234

Использование where или group by исключает некоторые данные, поскольку они находятся в разных строках.Это возможно?У меня есть 48 настраиваемых полей, которые вы можете добавить, так что вы можете себе представить, что правильное его выполнение сэкономит много работы.

Спасибо!

Редактируйте, чтобы добавить образцы данных из customvarcharlong:

+--------+---------------+-------+----------+
|   id   | customFieldId | info  | recordId |
+--------+---------------+-------+----------+
| 170887 |           171 | N     |     1481 |
| 170888 |           172 | 3.03  |     1481 |
| 170889 |           173 | new   |     1481 |
| 170890 |           170 | 0     |     1481 |
| 170891 |             5 | 0     |     1481 |
| 170892 |             6 | OEM1  |     1481 |
| 170893 |             7 | Num1  |     1481 |
| 170894 |           200 | 4184  |     1481 |
| 170895 |           120 | Truck |     1481 |
+--------+---------------+-------+----------+

Как вы, вероятно, можете сказать, проблема в том, что рекордный повтор повторяется, поскольку существует много значений настраиваемых полей, и настраиваемый идентификатор повторяется для каждого идентификатора записи.Я хотел бы получить информационное значение для каждой строки в своем собственном столбце для каждого показателя записи (recordid = productid).

1 Ответ

0 голосов
/ 06 декабря 2018

Вы работаете с моделью данных EAV .По сути, вам нужно отдельное левое соединение с таблицей values ​​ (customvarcharlong) для каждого атрибута (customfieldid), который вы хотите вернуть для данного набора сущностей (product).

Попробуйте это так:

SELECT PRODUCT.id AS ProductId, 
       PRODUCT.num AS ProductNumber, 
       cvcl6.info AS OEM1Name, 
       cvcl7.info AS OEM1NumbersA
FROM product
    LEFT JOIN customvarcharlong cvcl6
        ON product.id=cvcl6.recordid
            AND cvcl6.customfieldid = '6'
    LEFT JOIN customvarcharlong cvcl7
        ON product.id=cvcl7.recordid
            AND cvcl7.customfieldid = '7'
WHERE PRODUCT.activeFlag = TRUE
ORDER BY PRODUCT.id
...