[SQL] Туплю с запросом

nik93

как в одном запросе сделать:
1. Первым селектом выборку определенных ID из таблицы
2. Вторым селектом сделать выборку определенных ID из другой таблицы, но чтобы они не совпадали с ID содержащимися в первой выборке. Голова уже не варит :crazy:

Boris1980

select t2.id
from table_2 t2
where
t2.id not in (
select t1.id
from table_1 t1 )

nik93


хотя... тогда в результат запроса не попадает содержимое второго селекта :crazy: а должно попадать

nik93

и еще в догонку:
Как в результат одного селекта запихнуть результат другого с замещением строки при совпадении ID

Boris1980

Первое что на ум пришло:
select
  t2.id,
  nvl (
    (select t1.field from table_1 t1 where t1.id = t2.id
    t2.field
   )
from table_2 t2
ps: Что-то мне кажется ты задачу не тем путем решаешь.

nekaya

SELECT * FROM TableA
EXCEPT
SELECT * FROM TableB
(MS SQL 2005)

Boris1980

Вот еще вариант:
select t2.id, t2.field_1, t2.field_2
from table_2 t2
where
t2.id not in (
select t1.id
from table_1 t1 )
union all
select t1.id, t1.field_1, t1.field_2
from table_1 t1

nekaya

select b.id
from a right join b on a.id = b.id
where a.id is mull

nik93

взрыв мозга обеспечен :grin:
пашол разбираться...
Возможно не тем способом, но сложно выбрать способ, когда ниодного не знаешь...
Задачка: Есть две таблицы, с двумя общими колонками ID и Content. Надо в зависимости от флага, который содержится в одной из этих таблиц, брать Content для ID из первой или второй таблицы.

pitrik2

mull
ups
wtf?

nik93

наверно null

korsika

Что-то ты совсем запутал что надо получить.
Или это несколько разных задач?

Andr163

b требует доказать, что a не осёл

nik93

Что-то ты совсем запутал что надо получить.
Или это несколько разных задач?
тут вообще все сложно, я сам запутался, сейчас разгребаю :p

pitrik2

ну напиши нам побольше про это
поможем разгрести

nik93

подумав, сдела на подобие этого
select t2.id, t2.field_1, t2.field_2
from table_2 t2
where
t2.id not in (
select t1.id
from table_1 t1 )
union all
select t1.id, t1.field_1, t1.field_2
from table_1 t1
но не нравится, что по сути один и тотже селект выполняется дважды.

0000

2
Если b.id не уникально, то будет ( | )

Boris1980

А сколько данных в таблицах? Как долго работает запрос?

0000

Субд какой? В Оракл есть with для этого (т.е. вначале пишешь запрос, обзываешь его, а потом в нескольких местах можешь просто писать его синоним. Запрос будет выполняться всего один раз, но есть косяк - индексов у with нет => иногда стоит допускать выполнение запроса дважды)

nik93

А сколько данных в таблицах? Как долго работает запрос?
в таблице данных мало, т.к. все в разработке
СУБД MS SQL Express 2005

nik93

В Оракл есть with для этого (
У MS тоже есть. Т.е. если я вынесу этот селект в WITH то он будет делать его 1 раз не зависимо от того сколько раз я его буду подставлять?

0000

Если id - уникален в обоих таблицах, то делай как написал.
Т.е. если набор id в обоих таблицах совпадает

select t1.id, case/decode/чего там в MS SQL (от столбца индикатора и от t1.Context, t2.Context)
from t1 inner join t2 on t1.id = t2.id

Если набор id в обоих таблицах пересекается, но в общем то различен

select case/decode/что-то еще для выбора ненулевого из t1.id и t2.id, case/decode/чего там в MS SQL (от столбца индикатора и от t1.Context, t2.Context)
from t1 outer join t2 on t1.id = t2.id

Точно не уверен про MS, но на Oracle join достаточно быстро прошел бы, т.к. для соединения использовался бы индекс по id.

nik93

да, уникален, надо попробовать.

Boris1980

Если все только в разработке. Может пока не поздно есть возможность пересмотреть архитектуру данных, что удобней доставать значения для ID. Хотя какая у вас там кухня не известно.

nik93

пересмотреть архитектуру данных
она мегагибкая, из-за этого такие навороты...

zya369

она мегагибкая
:grin: :grin: :grin:

nik93

:smirk:

nik93

Вроде всё работает и достаточно шустро :)
теперь такой вопрос:
Есть INSERT, который делается в таблицу с автоинкрементным полем ID.
Можно ли получать на лету ID только что вставленной строки или строк?
С расчетом на многопользовательность.
Сервер MS SQL 2005 Express.

klyv

@@IDENTITY
Оставить комментарий
Имя или ник:
Комментарий: