У нас есть две таблицы,MySQL Left Присоединяйтесь - не пустой или первая строка
PRODUCT_INDEX:
+----------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------+------+-----+---------+-------+
| PRODUCT_NUMBER | varchar(25) | NO | PRI | | |
| VENDOR_NUMBER | varchar(10) | NO | PRI | | |
| VENDOR_PRODUCT | varchar(25) | YES | MUL | | |
+----------------+---------------+------+-----+---------+-------+
ПРОДУКЦИИ:
+------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+---------------+------+-----+---------+-------+
| PRODUCT_NUMBER | varchar(25) | NO | PRI | | |
| DESCRIPTION_ENG | varchar(500) | YES | MUL | | |
| STATUS | varchar(1) | YES | | | |
+------------------+---------------+------+-----+---------+-------+
, если мы выполним этот запрос, один PRODUCT_INDEX:
SELECT * FROM PRODUCT_INDEX WHERE PRODUCT_NUMBER = '900338'
Мы получаем 3 результата в этом заказ.
+----------------+---------------+----------------+
| PRODUCT_NUMBER | VENDOR_NUMBER | VENDOR_PRODUCT |
+----------------+---------------+----------------+
| 900338 | F00045 | |
| 900338 | F00509 | |
| 900338 | F01041 | CSR6719-2 |
+----------------+---------------+----------------+
Теперь мне нужно сделать запрос выбирающий весь продукт из таблицы ПРОДУКТА и РЕГИСТРИРУЙТЕСЬтолько один ряд из таблицы PRODUCT_INDEX. Если поле VENDOR_PRODUCT не пусто для одной строки, мы хотели бы перенести эту строку. Если вся строка содержит поле VENDOR_PRODUCT, мы хотели бы взять первую строку, и если вся строка не содержит поля VENDOR_PRODUCT, мы бы хотели взять первую строку.
Пока я традиционный левый присоединиться запрос (для этого примера я выбрать только один продукт, но мой запрос для всего изделия в таблице PRODUCT):
SELECT
P.PRODUCT_NUMBER,
P.DESCRIPTION_ENG,
P.STATUS,
PCI.VENDOR_NUMBER,
PCI.VENDOR_PRODUCT
FROM
PRODUCT P
LEFT JOIN
PROD_CROSS_INDEX PCI
ON
PCI.PRODUCT_NUMBER = P.PRODUCT_NUMBER
WHERE
P.PRODUCT_NUMBER = '900338';
Этот запрос возврата 3 строки, потому что у них есть 3 строки соответствие в PRODUCT_INDEX.
Как я могу выполнить свой запрос?
EDIT 2:
Вот мой полный запрос прямо сейчас:
SELECT
P.*,
IP.master AS MASTER_PACK,
IP.inner AS INNER_PACK,
PO.INFO1,
PO.INFO2,
PO.INFO3,
PO.INFO4,
PO.INFO5,
PO.INFO6,
PO.INFO7,
PO.INFO8,
PO.INFO9,
PO.INFO10,
PO.INFO11,
PO.INFO12,
PO.MEMO_ENG1,
PO.MEMO_FR1,
PO.FLAGS1,
PO.MEMO_ENG2,
PO.MEMO_FR2,
PO.FLAGS2,
PO.MEMO_ENG3,
PO.MEMO_FR3,
PO.FLAGS3,
PO.PICTURE,
PP.PRICE_1,
PP.PRICE_2,
PP.PRICE_3,
PP.PRICE_4,
PP.PRICE_5,
PP.PRICE_6,
MAX(IFNULL(PCI.VENDOR_PRODUCT, 0)) AS VENDOR_PRODUCT
FROM
PRODUCT P
LEFT JOIN
PRODUCT_OTHER PO
ON
PO.PRODUCT_NUMBER = P.PRODUCT_NUMBER
LEFT JOIN
PRODUCT_PRICES PP
ON
PP.PRODUCT_NUMBER = P.PRODUCT_NUMBER
LEFT JOIN
addison_intranet.ae_produit IP
ON
IP.sku = P.PRODUCT_NUMBER
LEFT JOIN
PROD_CROSS_INDEX PCI
ON
PCI.PRODUCT_NUMBER = P.PRODUCT_NUMBER
WHERE
P.STATUS != 'D' AND P.MASTER = '' AND P.PRODUCT_NUMBER NOT LIKE '%ECH%' AND P.PRODUCT_NUMBER NOT LIKE '%CARTE%' AND P.PRODUCT_NUMBER NOT LIKE '%ZZZ%' AND P.UNIT != 'KIT'
GROUP BY
P.PRODUCT_NUMBER
ORDER BY
P.PRODUCT_NUMBER
Этот вид задачи (или, по меньшей мере, часть этой проблемы) часто является симптомом плохого дизайна. Каждый раз, когда вы перечисляете имена столбцов, сигнальные колокола должны начинать звонить. – Strawberry
Наверное, но мы не разработчик базы данных этой системы, и наша цель состоит только в том, чтобы извлекать данные из этой базы данных для импорта в нашу новую систему. Я сохраню этот запрос, возможно, мы потеряем некоторые данные PRODUCT_VENDOR, что не очень важно. –