pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: John Tuliao <jptuliao@htechcorp.net>
To: David Johnston <polobo@yahoo.com>
Cc: John Tuliao <jptuliao@eglobalreach.net>
Cc: pgsql-sql@postgresql.org <pgsql-sql@postgresql.org>
Subject: Re: Query Problem... Left OuterJoin / Tagging Issue
Date: Mon, 16 Jan 2012 16:43:35 +0800
Message-ID: <4F13E337.6040305@htechcorp.net> (raw)
In-Reply-To: <85B4919C-C7AE-45BE-B32B-52B5B4F409FD@yahoo.com>
References: <4F0FB38A.2020809@eglobalreach.net>
	<85B4919C-C7AE-45BE-B32B-52B5B4F409FD@yahoo.com>

Thank you so much for your prompt reply David. I will consider your 
advice and put it to mind and action. I hope you all don't get tired of 
helping!

For now, I will note down what I need to and do the necessary 
adjustments. Thank you for your time!

On Friday, 13 January, 2012 10:26 PM, David Johnston wrote:
> On Jan 12, 2012, at 23:31, John Tuliao <jptuliao@eglobalreach.net 
> <mailto:jptuliao@eglobalreach.net>> wrote:
>
>> Hi,
>>
>> I've been working on this for quite awhile now and don't seem to get 
>> the proper query.
>>
>> I have basically 4 tables.
>>
>> 1. Table john_test contains the numbers of the calls.
>> 2. Table john_country contains the country with prefix.
>> 3. Table john_clients contains the clients and their sub_id's
>>     (because a client usually has a subclient, [ex. highway-2, 
>> highway-3]) and their prefix.
>> 4. Table john_test contains the phone numbers.
>>
>> --------------------------------------------------------------------------------------------------------------------------------
>>
>> select * from john_client_rate limit 3;
>>
>>    name   |    country     | cali | cana | callrate | dir_id | 
>> trans_id | svc_id | base | incr | client_id
>> ----------+----------------+------+------+----------+--------+----------+--------+------+------+-----------
>>  highway  | Afghanistan    |      |      |   0.6212 |      0 | 
>> 0        |        |    6 |    6 |         4
>>  highway  | Albania        |      |      |   0.3945 |      0 | 
>> 1        |        |    6 |    6 |         4
>>  highway  | Bahamas        |      |      |   0.0513 |      0 | 
>> 1        |        |    6 |    6 |         4
>> (3 rows)
>>
>> select * from john_country limit 3;
>>
>>     country    | state |  prefix  | area_code
>> ---------------+-------+----------+-----------
>>  Afghanistan   |       | 93       |
>>  Aland Islands |       | 35818120 |
>>  Albania       |       | 355      |
>> (3 rows)
>>
>>
>> select * from john_clients limit 3;
>>
>>  id | client_id | sub_id | name     | prefix  |  type
>> ----+-----------+--------+----------+---------+--------
>>  80 |        80 |      0 | highway  | 71081   | client
>>  80 |        80 |      0 | highway  | 7107011 | client
>>  80 |        80 |      0 | highway  | 71091   | client
>> (3 rows)
>>
>> select * from john_test limit 3;
>>
>> client_id |  name   |       phonenum       |     calledphonenum      
>> | phonenumtranslat | direction | duration
>> ----------+---------+----------------------+-------------------------+------------------+-----------+----------
>>         2 | highway | 83863011351927330133 | 20100147011351927330133 
>> |                  | outbound  |      363
>>         2 | highway | 83863011441179218126 | 1943011441179218126     
>> |                  | outbound  |       83
>>         2 | highway | 83863011441179218126 | 20100147011441179218126 
>> |                  | outbound  |       32
>> (3 rows)
>>
>> --------------------------------------------------------------------------------------------------------------------------------
>>
>> What I want to do is to remove the prefix, and retain the number 
>> using the following query:
>>
>> select
>> john_test.name,
>> john_test.gwrxdcdn,
>> john_test.duration as dur,
>> john_client_rate.name as name2,
>> john_client_rate.country,
>> john_country.prefix,
>> substring(john_test.gwrxdcdn from length(john_country.prefix)+1) as 
>> strip,
>> get_duration(john_test.duration::int,john_client_rate.base,john_client_rate.incr) 
>> as realdur
>> from john_test
>> left outer join john_client_rate
>> on (prefix in
>>    (
>>       select prefix from john_client_rate
>>       where john_test.phonenum ~ ( '^' || john_country.prefix)
>>       order by length(john_country.prefix) desc limit '1'
>>    )
>>    )
>> limit 20;
>
> If you have a select within the ON clause of a join it isn't really a 
> join.  ON clauses should be simple expressions (almost always 
> equality) between fields on the two tables with AND/OR logic.
>
>>
>> --------------------------------------------------------------------------------------------------------------------------------
>>
>> I have achieved this already, now I want to identify which country 
>> it's supposed to be for.
>> Problem is sometimes the "stripped" number that is retained shows: 
>> 8661234567 or 8889876543
>> This would indicate that the call is already toll free without me 
>> being able to identify the country.
>> How can I get over this?
>>
>> Further, I am planning to use multiple joins since I have several 
>> tables and so as to identify missing countries. On this questions 
>> which query is better?
>>
>> Query 1:
>>
>> Select table1.column,table2.column,table3.column from table1 left 
>> outer join table 2 on (table1.column=table2.column) left outer join 
>> table3 on (table2.column=table3.column) ;
>>
>> or Query 2:
>>
>> Select table1.column,table2.column,table3.column from 
>> table1,table2,table3 where [conditions] ;
>>
>
> Query 1 is an outer join, query 2 is an inner join; totally different 
> semantics so the question is more "which one will work" versus "which 
> one is better".  Do you at least understand the difference?
>
>> Ultimately, I want to run one query that will satisfy these things 
>> and help me insert into a table that will have it "TAGGED" properly 
>> with the right Country, Client(name), prefix, and Rate for 
>> computation with Duration.
>>
>> Hope you can reply to me asap. This is of urgent importance. Thank 
>> you and any help would be greatly appreciated!
>>
>> - JT
>
>
> Ignore this specific query for the moment and just figure out the 
> various relationships between the tables.  Once you have that the 
> queries become much easier.
>
> Write out your desired output columns, with table prefixes, and mark 
> whether each on is optional or mandatory.  Tables with optional fields 
> are outer joined to other tables, ideally those with only mandatory 
> fields.  The corresponding ON clauses should use simple equalities, 
> though you may modify the the comparison values using functions.
>
> It sounds like you need to take a step back and do some serious 
> reading on SQL basics, though I'll give you credit for at least trying 
> and being somewhat descriptive of your goal.
>
> David J.

view thread (3+ messages)

Message-ID: <4F13E337.6040305@htechcorp.net>
Permalink:  ../4F13E337.6040305@htechcorp.net/
Also on:    postgresql.org/message-id/4F13E337.6040305@htechcorp.net

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: jptuliao@htechcorp.net, polobo@yahoo.com, jptuliao@eglobalreach.net
  Subject: Re: Query Problem... Left OuterJoin / Tagging Issue
  In-Reply-To: <4F13E337.6040305@htechcorp.net>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox