Subject | Re: How to update this table? |
---|---|
Author | tomsee7 |
Post date | 2011-10-07T17:17:05Z |
--- In firebird-support@yahoogroups.com, Mark Rotteveel <mark@...> wrote:
However, for UPDATES + similar statements, the scanning of the main table in relation to any sub-selects was not (i.e how the UPDATE was actually carried out) plus whether all columns were really returned or not.
e.g.
UPDATE TableA TA
SET TA.USED = 'T'
WHERE EXISTS(SELECT * FROM TableB TB WHERE TA.LINE = TB.LINE)
1. using a cursor
for each row in tablea ta
(using index or not) locate a match in tableb for TA.LINE = TB.LINE
do an update in place
2. Selects data as a completely seperate list using normal SELECT
update list as a single statement
Tom
>You are misunderstanding me. For SELECTs this was understood.
> On 7-10-2011 11:12, tomc7777777 wrote:
> >> There's no way subselects can be materialized, at least doing ..
> >
> > My use of the term 'materialized' may have been misunderstood, it was meant to relate to whether/how the sub-select row is retrieved and compared when * vs 1 are used.
> >
> > I've a copy of Celko's 'SQL for Smarties' and he outlines the theoretical way this happens but I think says it would never happen this way in reality and is implementation-specific. If someone with intimate knowledge of the FB source (and ideally a humble disposition) could show a briefly summary of the actual steps in resolving the SQL above then that would be much appreciated.
>
> You are reversing the argument. First the row needs to be found based on
> the WHERE clause (using indices and/or natural scan of all the rows),
> and then the columns specified in the select are returned (be it a
> specific list or *). Using the reverse would be absurd, because then the
> selection of rows would depend on the columns you want to be returned
> from a row.
> --
> Mark Rotteveel
>
However, for UPDATES + similar statements, the scanning of the main table in relation to any sub-selects was not (i.e how the UPDATE was actually carried out) plus whether all columns were really returned or not.
e.g.
UPDATE TableA TA
SET TA.USED = 'T'
WHERE EXISTS(SELECT * FROM TableB TB WHERE TA.LINE = TB.LINE)
1. using a cursor
for each row in tablea ta
(using index or not) locate a match in tableb for TA.LINE = TB.LINE
do an update in place
2. Selects data as a completely seperate list using normal SELECT
update list as a single statement
Tom