I'd try to check why discounts are different. Join with 'or' should work.
Build (one query) except all (another query) and check some rows from
result.
 13 лип. 2013 01:28, "Brian Fehrle" <bri...@consistentstate.com> напис.

> On 07/11/2013 06:46 PM, Josh Berkus wrote:
>
>> Brian,
>>
>>  3. I'm trying to eliminate the union, however I have two problems.
>>> A) I can't figure out how to have an 'or' clause in a single join that
>>> would fetch all the correct rows. If I just do:
>>> LEFT OUTER JOIN table2 t2 ON (t2.real_id = t.id OR t2.real_id =
>>> t.backup_id), I end up with many less rows than the original query. B.
>>>
>>> I believe the issue with this is a row could have one of three
>>> possibilities:
>>> * part of the first query but not the second -> results in 1 row after
>>> the union
>>> * part of the second query but not the first -> results in 1 row after
>>> the union
>>> * part of the first query and the second -> results in 2 rows after the
>>> union (see 'B)' for why)
>>>
>>> B) the third and fourth column in the SELECT will need to be different
>>> depending on what column the row is joined on in the LEFT OUTER JOIN to
>>> table2, so I may need some expensive case when logic to filter what is
>>> put there based on whether that row came from the first join clause, or
>>> the second.
>>>
>> No, it doesn't:
>>
>> SELECT t.id,
>>         t.mycolumn1,
>>         table3.otherid as otherid1,
>>         table3a.otherid as otherid2,
>>         t.mycolumn2
>> FROM t
>>         LEFT OUTER JOIN table2
>>            ON ( t.id = t2.real_id OR t.backup_id = t2.real_id )
>>         LEFT OUTER JOIN table3
>>            ON ( t.typeid = table3.id )
>>          LEFT OUTER JOIN table3 as table3a
>>             ON ( table2.third_id = table3.id )
>> WHERE t.external_id IN ( ... )
>> ORDER BY t.mycolumn2, t.id
>>
> I tried this originally, however my resulting rowcount is different.
>
> The original query returns 9,955,729 rows
> This above one returns 7,213,906
>
> As for the counts on the tables:
> table1      3,653,472
> table2      2,191,314
> table3    25,676,589
>
> I think it's safe to assume right now that any resulting joins are not
> one-to-one
>
> - Brian F
>
>
>
>
> --
> Sent via pgsql-performance mailing list (pgsql-performance@postgresql.**
> org <pgsql-performance@postgresql.org>)
> To make changes to your subscription:
> http://www.postgresql.org/**mailpref/pgsql-performance<http://www.postgresql.org/mailpref/pgsql-performance>
>

Reply via email to