私は今日、postgresqlを使って何か変わった動作をしました。言い換えればSQL LEFT JOINは左のテーブルの列を空にします
129 | | |
195 | | |
251 | | |
...
は、テーブルactual_prices
の列が空である:
WITH actual_prices AS (
-- Looking for prices from now to the given number of days back
SELECT *
FROM prices
WHERE price_date >= now()::date - 93
)
, distinct_products_sold AS (
SELECT distinct(id_product) as pid FROM products_sold
)
, first_prices AS (
SELECT s.pid, p.product_id, p.price_date, p.price
FROM distinct_products_sold s
LEFT JOIN actual_prices p ON p.product_id = s.pid
)
select * from first_prices;
このコードは、この種のものを出力します。私はJOIN
をちょっと調べてみました。LEFT JOIN
の代わりにRIGHT JOIN
を入力すると、distinct_products_sold
の列は空になりますが、actual_prices
の列は正しく表示されます。何が原因でしょうか?
Distinctは(列上の)関数ではなく、SELECT DISTINCTの一部であり、選択された行全体で機能します。 'SELECT distinct(id_product)...'は 'SELECT DISTINCT id_product ... 'と同じです。 – jarlh
なぜそれは変だ? 'p.product_id = s.pid'のどちらのテーブルでも、おそらく一致する行はありません。 – GarethD
結合の性質は、「空の」結合が記録されることです。 'LEFT JOIN'の場合、結合の左側のレコードは一致するものがなくてもすべて保持され、' RIGHT JOIN'の場合は真です。 –