Связь нескольких полей со справочником

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Связь нескольких полей со справочником

Сообщение VVitafresh » 30.09.2005 (Пт) 22:33

Помогите связать таблицы:
Код: Выделить всё

create table table1
( id_ref text(14) not null,
sc1 text(14), sc2 text(14), sc3 text(14) )

и табл. с расшифровкой для поля sc
Код: Выделить всё

create table table2
( sc text(14) not null,
opisanie text(10) not null )

так, чтобы получить таблицу со структурой:
id_ref, sc1, opisanie1, sc2, opisanie2, sc3, opisanie3

Синтаксис можно Transact-SQL, можно Access.

P.S. Догадываюсь все это делается с помощью JOIN и псевдонимов, только вот как именно?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.09.2005 (Пт) 22:44

Делается и джойном, но, как сказал бы Алибек,
Код: Выделить всё
SELECT t1.id_ref, t1.sc1, op1.opisanie, t1.sc2, op2.opisanie, t1.sc3, op3.opisanie
FROM table1 t1, table2 op1, table2 op2, table2 op3
WHERE t1.sc1 = op1.sc AND t1.sc2 = op2.sc AND t1.sc3 = op3.sc
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 30.09.2005 (Пт) 23:23

GSerg, спасибо. Этот вариант работает.
Но как быть в случае, если какое то из полей sc1, sc2, sc3 не заполнено (что допускается структурой таблицы)?
В этом случае нужно в строке выводить пропуски или NULL. Что-то типа:
Код: Выделить всё

id_ref | sc1 | opisanie1 | sc2 | opisanie2 | sc3 | opisanie3
1        111     aaa       NULL  NULL        113   ccc

:roll:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.09.2005 (Пт) 23:31

Добавь в table2 строку NULL, NULL.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 30.09.2005 (Пт) 23:40

Такой вариант не пройдет. Реально в Table1 в полях sc1, sc2, sc3 может быть либо текстовое значение, либо пустая строка (а не значение NULL). Но выводить строку с описаниями нужно, если хоть в одном из перечисленных полей есть значение (а оно обязательно есть в одном или нескольких полях).
Вот такая вот загвоздка вышла.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.09.2005 (Пт) 23:53

Добавь в table2 две строки: NULL, NULL и "", NULL.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 01.10.2005 (Сб) 0:03

Да нет же. Этот вариант не подходит:
Код: Выделить всё

CREATE TABLE table2
( sc text(14) NOT NULL,
opisanie text(10) NOT NULL )

Структуру таблиц изменять не имею права (могу только делать выборки, создавать хранимые процедуры и временные таблицы).
Так что надо выкручиваться как-то по-другому. На ум приходит только OUTER JOIN. Но как его сюда прикрутить?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.10.2005 (Сб) 0:18

Код: Выделить всё
SELECT t1.id_ref, t1.sc1, op1.opisanie, t1.sc2, op2.opisanie, t1.sc3, op3.opisanie
FROM table2 op3 RIGHT JOIN (table2 op2 RIGHT JOIN (table2 op1 RIGHT JOIN table1 t1 ON t1.sc1 = op1.sc) ON t1.sc2 = op2.sc) ON t1.sc3 = op3.sc
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 01.10.2005 (Сб) 0:46

Оно самое!
GSerg, спасибо огромное!

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 01.10.2005 (Сб) 11:09

А чего вы так LEFT OUTER JOIN не любите? ;) Хотя, конечно, с ним побольше придется написать...
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 03.10.2005 (Пн) 8:13

gaidar писал(а):А чего вы так LEFT OUTER JOIN не любите? ;) Хотя, конечно, с ним побольше придется написать...


Да чего ради побольше:

Код: Выделить всё
SELECT t1.id_ref, t1.sc1, op1.opisanie, t1.sc2, op2.opisanie, t1.sc3, op3.opisanie
FROM table1 t1
LEFT JOIN table2 op1 ON t1.sc1 = op1.sc
LEFT JOIN table2 op2 ON t1.sc2 = op2.sc
LEFT JOIN table2 op3 ON t1.sc3 = op3.sc


А с RIGHT JOIN примерчик привели сделав его в Access-e (или по его подобию)...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 03.10.2005 (Пн) 12:50

Этот вариант мне даже больше нравится (более читабельный). Правда работает только в Transact-SQL, под Access приходится еще скобки лепить:
Код: Выделить всё

SELECT t1.id_ref, t1.sc1, op1.opisanie, t1.sc2, op2.opisanie, t1.sc3, op3.opisanie
FROM ((table1 AS t1
LEFT JOIN table2 AS op1 ON t1.sc1 = op1.sc)
LEFT JOIN table2 AS op2 ON t1.sc2 = op2.sc)
LEFT JOIN table2 AS op3 ON t1.sc3 = op3.sc;


А есть ли в данном случае разница между LEFT JOIN и LEFT OUTER JOIN :?:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.10.2005 (Пн) 16:56

Нет, ибо написанное Andrey Fedorov есть точное зеркальное отражение написанного мною.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList  
cron