Запрос на объединение

Alexandr1987
Дата: 27.11.2009 08:35:58
Привет всем, у меня есть простенькая база из двух несвязанных таблиц, с большим числом записей в каждой более 7000 записей, я сделал запрос, который позволяет объдинить все одинаковые записи этих двух таблиц, а именно я вывожу по два столбца каждой таблицы.

ВОПРОС заключается как сделать запрос на то, чтобы выводились только отличающиеся записи этих таблиц, то есть у них есть поле рег, в оой и другой таблице, мне нужно вывести все отличающиеся записи полей рег из обоих таблиц. Заранее спасибо.
ё
Дата: 27.11.2009 08:48:25
Alexandr1987,

точно так же, - только наоборот

вот как вы думаете - что вам пожно посоветовать?
ни запроса,
ни структуры таблиц,
ни намека на то - как они объединяются!
отакота
Дата: 27.11.2009 09:19:46
Alexandr1987
Привет всем, у меня есть простенькая база из двух несвязанных таблиц, с большим числом записей в каждой более 7000 записей, я сделал запрос, который позволяет объдинить все одинаковые записи этих двух таблиц, а именно я вывожу по два столбца каждой таблицы.

ВОПРОС заключается как сделать запрос на то, чтобы выводились только отличающиеся записи этих таблиц, то есть у них есть поле рег, в оой и другой таблице, мне нужно вывести все отличающиеся записи полей рег из обоих таблиц. Заранее спасибо.

select T1.рег from T1 left join T2 on T1.рег=T2.рег where T2.рег is null
union
select T2.рег from T2 left join T1 on T2.рег=T1.рег where T1.рег is null

первый select - это значения поля [рег] из первой таблицы, которых нет во второй
второй select - это значения поля [рег] из второй таблицы, которых нет в первой
и union - объединение этих значений в единый список

если вам надо выводить не только поле рег, а вообще все поля - что в едином списке возможно в случае, если структуры двух таблиц совпадают, то в select'ах вместо рег пишите *.
Igor Mitichev
Дата: 27.11.2009 10:14:13
отакота,

А можно несколько изменить вид результирующей таблицы? Имеем:
SELECT * from table1

id1         reg1        data1
----------- ----------- 
1           1           sdgfg
2           3           ghfjghn
3           5           adfgdgh
4           7           asdfggh
5           9           sdasdv
6           10          sdfghghkhkl

(строк обработано: 6)
SELECT * from table2

id2         reg2        data2
----------- -----------
1           2           ngchjnmgf
2           4           gvdfbfgjhn
3           6           zdfbdfghn
4           8           gdfnjg,
5           10          gvngj,k.,k

(строк обработано: 5)
SELECT a.reg1 from table1 as a left join table2 as b
ON a.reg1=b.reg2 
WHERE b.reg2 is null
UNION
SELECT a.reg2 from table2 as a left join table1 as b
ON b.reg1=a.reg2 
where b.reg1 is null
;

reg1
-----------
1
2
3
4
5
6
7
8
9

(строк обработано: 9)

Но у нас два разных атрибута. То есть хотелось бы, чтобы результирующая таблица выглядела так:

 reg1    reg2   
 ------  ------ 
 1              
         2      
 3              
         4      
 5              
         6      
 7              
         8      
 9     


в MS Access. Впрочем, если не сложно, на вариант с использованием FULL JOIN тоже хотелось бы посмотреть.
отакота
Дата: 27.11.2009 10:30:37
Igor Mitichev
отакота,
SELECT a.reg1 from table1 as a left join table2 as b
ON a.reg1=b.reg2 
WHERE b.reg2 is null
UNION
SELECT a.reg2 from table2 as a left join table1 as b
ON b.reg1=a.reg2 
where b.reg1 is null
;

хотелось бы, чтобы результирующая таблица выглядела так:

 reg1    reg2   
 ------  ------ 
 1              
         2      
 3              
         4      
 5              
         6      
 7              
         8      
 9     



можно как-то так
select IIf(T.reg1=0,null,T.reg1) as reg1,IIF(T.reg2=0,null,T.reg2) as reg2 from (
SELECT a.reg1, 0 as reg2, a.reg1 as reg0 from table1 as a left join table2 as b
ON a.reg1=b.reg2 
WHERE b.reg2 is null
UNION
SELECT 0 as reg1, a.reg2, a.reg2 as reg0 from table2 as a left join table1 as b
ON b.reg1=a.reg2 
where b.reg1 is null
) T order by reg0
отакота
Дата: 27.11.2009 10:40:44
можно так еще:
transform Min(reg)
select reg as x from (
SELECT a.reg1 as reg, "reg1" as regname from table1 as a left join table2 as b
ON a.reg1=b.reg2 
WHERE b.reg2 is null
UNION
SELECT a.reg2, "reg2" from table2 as a left join table1 as b
ON b.reg1=a.reg2 
where b.reg1 is null) 
group by reg
pivot regname
если лишнее поле x не смущает
Igor Mitichev
Дата: 27.11.2009 11:49:19
отакота

можно как-то так
...
можно так еще


Да. Трехэтажные конструкции-то получаются. При том, существенно выходят за рамки ANSI SQL. Соответственно, так просто на клиент-серверную архитектуру не перенесешь. Казалось бы простой вопрос, а голову сломаешь.
отакота
Дата: 27.11.2009 12:03:13
вот еще вариант:
select reg1, reg2 from (
SELECT a.reg1, "" as reg2 from table1 as a left join table2 as b
ON a.reg1=b.reg2 
WHERE b.reg2 is null
UNION
SELECT "" as reg1, a.reg2 from table2 as a left join table1 as b
ON b.reg1=a.reg2 
where b.reg1 is null)
order by Val(reg1)+Val(reg2)
qwrqwr
Дата: 27.11.2009 12:15:22
отакота
Эх.. пока писал - уже увидел вариант. Но не выбрасывать же :)
select * from (
    SELECT Table1.reg1 as a, Table2.reg2 as b
      FROM Table1 LEFT JOIN Table2 
        ON Table1.reg1 = Table2.reg2
     WHERE Table2.reg2 Is Null
union all
    SELECT Table1.reg1, Table2.reg2
      FROM Table1 RIGHT JOIN Table2 
        ON Table1.reg1 = Table2.reg2
     WHERE Table1.reg1 Is Null)
order by nz(a,0) + nz(b,0)
qwrqwr
Дата: 27.11.2009 12:19:23
PS. Удивило, что в конструкции с юнионом акцесс не дает напрямую делать сортировку по вычисляемому выражению - пришлось обернуть в подзапрос.
На других типах запросов ордер бай по выражению проходил на ура.