Not really, then I would have to select child table with which to JOIN on 
condition, based on the value of parent table.


CREATE TABLE parent(
  id INTEGER PRIMARY KEY,
  child_type INTEGER,
  CHECK(child_type IN (1, 2))
);

CREATE TABLE child_1(
  id INTEGER PRIMARY KEY,
  my_value INTEGER,
  ...
);

CREATE TABLE child_2(
  id INTEGER PRIMARY KEY,
  my_value INTEGER,
  my_other value INTEGER,
  ...
);

CREATE TABLE parent_child_1_link(
  parent_id INTEGER PRIMARY KEY,
  child_1_id INTEGER,
  FOREIGN KEY(parent_id) REFERENCES parent(id),
  FOREIGN KEY(child_1_id) REFERENCES child_1(id)
);

CREATE TABLE parent_child_2_link(
  parent_id INTEGER PRIMARY KEY,
  child_2_id INTEGER,
  FOREIGN KEY(parent_id) REFERENCES parent(id),
  FOREIGN KEY(child_2_id) REFERENCES child_2(id)
);


now, depending on the child_type in the parent I want to select 
 * child_type
 * child_id
 * my_value of specific child
 * some other values of specific child
 * some other values of parent

I cannot JOIN obviously, so I decided to first fetch specific ID of a child, 
alias it and then use it
in selection of properties of specific child. This way i would avoid querying 
parent_child_1_link
or parent_child_2_link tables for each property of specific child.

But i think 2 queries will work more efficiently.

(SIDE NOTE: I know about necessity of indices for FKs, I decided 
to omit them because they are meaningless in this example)

8 February 2016, 13:42:04, by "J Decker" <d3ck0r at gmail.com>:

>   On Mon, Feb 8, 2016 at 3:38 AM, Paul  wrote:
> > I see, thank you for pointing out.
> >
> > I wanted to use it on table with conditional relations with 3 different 
> > child tables.
> > Though I could use a trick and fit data selection into one query, 
> > efficiently.
> > Alas I am forced to stick to 2 queries.
> >
> 
> Might still be able to collapse it into one CTE query.... but I don't
> know what the other part is to demo that...
> 
> https://www.sqlite.org/lang_with.html
> 
> > Thank you!
> >
> > 8 February 2016, 12:08:26, by "Clemens Ladisch" :
> >
> >>   Paul wrote:
> >> > I am curious what is a particular reason that aliased columns in a query 
> >> > not visible to sub-queries?
> >>
> >> Because the SQL standard says so.
> >>
> >> > Of course it is possible to duplicate expression in sub-query ...
> >> > But this would not be as efficient as to access result of already 
> >> > evaluated expression.
> >>
> >> An alias refers not to an expression's value but to the expression
> >> itself, so it would not be any more efficient.  (SQLite's optimizer
> >> typically is not smart enough to detect and remove the duplication.)
> >>
> >>
> >> As a workaround, you have to move the expression into a subquery in
> >> the FROM clause:
> >>
> >> SELECT super_id,
> >>        (SELECT qux FROM baz WHERE id = super_id)
> >> FROM (SELECT id as super_id FROM foo);
> >>
> >>
> >> Regards,
> >> Clemens
> >> _______________________________________________
> >> sqlite-users mailing list
> >> sqlite-users at mailinglists.sqlite.org
> >> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> >
> >
> > _______________________________________________
> > sqlite-users mailing list
> > sqlite-users at mailinglists.sqlite.org
> > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users


Reply via email to