On 2017/03/22 9:53 AM, Eric Grange wrote:
For the sake of curiosity, is anyone (as in any human) using RIGHT JOIN?

Personally I never had a need for a RIGHT JOIN, not because of theoretical
or design considerations, but it just never came into my flow of thought
when writing SQL...

I guess some automated SQL query generators could use it though, because
they do not have a "flow of thought".

I had a need of it the other day (something that can easily be overcome with a CTE or subquery, but still may have made the sql read more natural):

We have one system which contains (among other things) clients, suppliers and stock tables.

A stock item will mostly have a supplier and mostly will have an intended client (the production is bespoke) except for a few common materials.

So we needed a list of all suppliers linked to all clients affected by them (via Stock), and also see the clients who are not affected by any suppliers (which should really be a minimum number) and the suppliers who are not affecting any clients (which should also be a small list). Note that not all suppliers may be linked to live stock items, and not all clients may be linked to live stock items either - but they all need to show up in the list.

If I can try my hand at a schematic of the sets showing links:
clients:   [ A  B  C  D     E       ]
-  links        |     |     |
stock:     [    1     2  3  4  5    ]
-  links              |  |  |
suppliers: [ @  #     $  %  &     ! ]

I would need to see a "linking" query result showing overlap and non-links like this:
. clnt | supp| stck
. ---- | ---- | ----
.   A  | NULL | NULL
.   B  | NULL|   1
.   C  | NULL| NULL
.   D  |   $  |   2
.   E  |   &  |   4
. NULL |   @ | NULL
. NULL |   # | NULL
. NULL |   % |   3
. NULL |   ! | NULL

Note that I don't actually need the stck column, just adding it to show more sensible results. Also note that items linked to neither client nor supplier need not show up (stock item 5 in this case), so I only need results having either a client or a supplier.


The obvious solution was:
SELECT clients.name, suppliers.name
  FROM clients
  LEFT JOIN stock ON stock.client = clients.id
  RIGHT JOIN suppliers ON stock.supplier =  suppliers.id
 WHERE (clients.name IS NOT NULL) OR (suppliers.name IS NOT NULL)
;

I suppose this could have worked too:
SELECT clients.name, suppliers.name
  FROM suppliers
  LEFT JOIN stock ON stock.supplier = suppliers.id
  RIGHT JOIN clients ON stock.client =  clients.id
 WHERE (clients.name IS NOT NULL) OR (suppliers.name IS NOT NULL)
;

or even this:
SELECT clients.name, suppliers.name
  FROM stock
  RIGHT JOIN suppliers ON stock.supplier = suppliers.id
  RIGHT JOIN clients ON stock.client =  clients.id
 WHERE (clients.name IS NOT NULL) OR (suppliers.name IS NOT NULL)
;


I don't see how to achieve that with simple joins in sqlite3. We used some CTEs to LEFT JOIN stock to suppliers, and then left-joined that CTE on the stock to the clients - which would also work using sub-query joins or filtered cross-joins (much slower).

So to add to the discussion: Yeah, we've needed it, but overcoming the problem was not exactly difficult and the use case itself is certainly not very common (or even mildly common, it's rather uncommon).

Cheers,
Ryan

_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to