On Sun, 20 Sep 2015 19:33:35 +0100
Simon Slavin <slavins at bigfraud.org> wrote:
> On 20 Sep 2015, at 7:15pm, James K. Lowden <jklowden at schemamania.org>
> wrote:
>
> > Simon Slavin <slavins at bigfraud.org> wrote:
> >
> >> Constructions like this
> >>
> >>> INSERT INTO _TAG_EXISTS_RESULT_ ( NAME, BOOL )
> >>> SELECT 'evil little sister'
> >>
> >> should be rewritten so that you are not trying to do a SELECT in
> >> the middle of your INSERT.
> >
> > Why in the world would you say that? That's the SQL assignment
> > function, the equivalent of
> >
> > A = A + B
>
> I would argue that that would be UPDATE, not INSERT. But I see your
> side of the issue.
I actually think that's the crux of the matter, Simon. If you think
you're operating on a row, then A = A + B is UPDATE, yes. If you think
you're operating on tables, then A = A + B is INSERT, and UPDATE
is more like
A = (A - C) + B
where C is the set of rows being replaced by B.
> Suppose the SELECT doesn't return anything. Do you still want to do
> the INSERT ?
If I said WHERE NOT EXISTS, why would I still want to "do the insert"?!
I'm with Yoda here: there is no try.
> Do you now have to look up the values to INSERT elsewhere ?
No, I do not, not if the values I didn't insert can be specified, e.g.
insert into S
select * from T where exists
(select 1 from R where ... );
If the values can't be specified in like manner, that would suggest to
me a problem with the database design.
TIMTOWTDI, for sure. More than one way to think about it, too. But I
see no downside to using INSERT...SELECT, except that it's startling to
someone unfamiliar with it.
--jkl