1

UNION ALL キーワードで作成されたクエリがあります。問題は、SELECT の 1 つが空のセットを返すと、それが破棄されることです。少なくとも NULL または空の行を返す必要があります。

各SELECTに一意のインデックスがある場合、どこかで読みましたが、破棄は防止されますが、機能していません。

クエリはループで作成されるため、日付インデックス(つまり、「2013 年 6 月」) が変更され、1 つの選択のみが示されます。

SELECT `products`.`id`, `products`.`ugid`, CONCAT(`products`.`fsg_pre`, `products`.`fsg_suff`) AS `fsg`, `year`, 'Mar' AS `month`, '2012-Mar' AS `index`, `Mar` AS `price`
FROM `prices`
JOIN `products`
ON (`products`.`uuid` = `prices`.`uuid`)
WHERE TRUE
AND `products`.`ugid` = '52777'
AND `products`.`fsg_pre` = 'SU'
AND `products`.`fsg_suff` = '3'
AND `year` = 2012

UNION ALL
[..........]
4

1 に答える 1

0

IMSoP で提案されているように LEFT JOIN を使用しない理由:

SELECT `products`.`id`, `products`.`ugid`, CONCAT(`products`.`fsg_pre`,
`products`.`fsg_suff`) AS `fsg`, `year`, 'Mar' AS `month`, '2012-Mar' AS `index`, 
`Mar` AS `price`
 FROM `prices`
 LEFT JOIN `products`
 ON `products`.`uuid` = `prices`.`uuid`
 WHERE `products`.`ugid` = '52777'
 AND `products`.`fsg_pre` = 'SU'
 AND `products`.`fsg_suff` = '3'
 AND `year` = 2012

または FULL JOIN を使用して、常に行を空にするかどうかを指定します。

 SELECT `products`.`id`, `products`.`ugid`, CONCAT(`products`.`fsg_pre`,
`products`.`fsg_suff`) AS `fsg`, `year`, 'Mar' AS `month`, '2012-Mar' AS `index`, 
`Mar` AS `price`
 FROM `prices`
 FULL JOIN `products`
 ON `products`.`uuid` = `prices`.`uuid`
 WHERE `products`.`ugid` = '52777'
 AND `products`.`fsg_pre` = 'SU'
 AND `products`.`fsg_suff` = '3'
 AND `year` = 2012

JOIN の仕組みを視覚的に確認するには、こちらのリンクを参照してください。

于 2013-06-08T02:36:51.307 に答える