Как сделать запрос?

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Как сделать запрос?

Сообщение AndreyG_80 » 31.03.2006 (Пт) 15:27

Всем добрый день.

Ситуация следующая:
В базе все ID уникальны, есть таблица
tbl0:
ID | Table
------------
5 | tbl1
9 | tbl2
2 | tbl2
7 | tbl1
Тоесть в tbl0 хранится информация в каой таблице находится тот или иной ID

и, допустим две таблицы tbl1 и tbl2
tbl1:
ID | Name
------------
5 | Вася
7 | Петя

tbl2:
ID | Name
------------
9 | Катя
2 | Юля

Вопрос: Какой запрос нужно написать для того, чтоб получить значение поля Name зная ID, но не зная в какой таблице оно находится?

З.Ы. Надеюсь обяснил понятно.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 31.03.2006 (Пт) 15:32

Минимум странная архитектура БД. Одним запросом, видимо, не удастся. Первым нужно найти в какой таблице лежит искомое значение, а вторым вытащить само значение.

Или одним запросом, объеденив предварительно все таблицы.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.03.2006 (Пт) 15:37

можно попробовать динамическим SQL, но это только, если база на MSSQL Server

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 31.03.2006 (Пт) 15:39

Одним запросом, видимо, не удастся. Первым нужно найти в какой таблице лежит искомое значение, а вторым вытащить само значение

Так вот в этом и вопрос.
Допустим первый запрос вернул название таблицы,
как подставить это название во второй запрос?
SELECT * FROM Название_таблицы_из_первого_запроса

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.03.2006 (Пт) 15:40

я же сказал, что динамический SQL, т.е. строку запроса ты собираешь сначала, а потом выполняешь получившийся запрос через exec

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 31.03.2006 (Пт) 15:41

Konst_One
Нет, база на Acces :(

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.03.2006 (Пт) 15:41

тогда только программным путем

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

Сообщение GSerg » 31.03.2006 (Пт) 15:42

Да, да, точно.

Код: Выделить всё
SELECT *
FROM
(
  SELECT table1.*, 'table1' AS TableName FROM table1
  UNION ALL
  SELECT table2.*, 'table2' FROM table2
  UNION ALL
  SELECT table3.*, 'table3' FROM table3
)
WHERE
TableName = 'искомое имя таблицы' AND id = искомыйid

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

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.03.2006 (Пт) 15:45

это, если все id уникальны для всего набора таких таблиц, иначе будет неопределенность при выборке значения

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

Сообщение GSerg » 31.03.2006 (Пт) 15:46

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

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.03.2006 (Пт) 15:47

GSerg
для частного случая из конкретных трех таблиц - это решение приемлимо, наверное, но я думаю, что автору нужно совсем другое, хотя может он и такого не знал :lol:

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 31.03.2006 (Пт) 15:47

1. Два запрса
Код: Выделить всё
sql = "SELECT Table FROM tbl0 WHERE ID = " & Id
Set rs = cn.Execute(sql)
TableName = rs("Table").Value

sql = "SELECT Name FROM " & TableName & " WHERE ID = " & Id


2. Один запрос
Код: Выделить всё
sql = "SELECT * FROM (SELECT * tbl1 UNION ALL SELECT * FROM tbl2) WHERE ID = " & Id

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 31.03.2006 (Пт) 15:50

ID уникальны для всех таблиц - это 100%
Но плохо то что это прокатывает только для SQL :cry: , а база то в Access.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.03.2006 (Пт) 15:53

А в чем сакральный смысл разбиения на несколько одинаковых таблиц?
Lasciate ogni speranza, voi ch'entrate.

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 31.03.2006 (Пт) 15:54

Как програмно в VB это сделать - я знаю.
Но нужно в Access это делать.
Наверное прийдется использовать VBA.

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 31.03.2006 (Пт) 15:56

alibek
Это в примере так, а на самом деле есть куча разных таблиц с уникальными ID и одна "таблица-маршрутизатор"

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 31.03.2006 (Пт) 15:56

AndreyG_80 писал(а):Как програмно в VB это сделать - я знаю.
Но нужно в Access это делать.
Наверное прийдется использовать VBA.

Вот это вот - чистый sql-Access
Код: Выделить всё
SELECT * FROM (SELECT * tbl1 UNION ALL SELECT * FROM tbl2) WHERE ID = seekId

, где seekId - параметр

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.03.2006 (Пт) 15:57

ты пост GSerg смотрел :?:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.03.2006 (Пт) 15:58

А почему нельзя все писать в одну таблицу, в которую добавляется третье вспомогательное поле?
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.03.2006 (Пт) 15:58

2 skiperski
предыдущий мой пост для автора топика, естно :wink:

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 31.03.2006 (Пт) 16:01

Konst_One писал(а):ты пост GSerg смотрел :?:

Это мне? Если мне, то смотрел, но уже после того как написал свой первый ответ. Так уж получилось, что они почти совпали. А что делать? Решений же не бесконечное множество.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 31.03.2006 (Пт) 16:01

Konst_One писал(а):2 skiperski
предыдущий мой пост для автора топика, естно :wink:

А!!!!!! Не успел!!!

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.03.2006 (Пт) 16:03

что-то мой инет сегодня притормаживает :cry:

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 31.03.2006 (Пт) 16:03

Код: Выделить всё
SELECT * FROM (SELECT * tbl1 UNION ALL SELECT * FROM tbl2) WHERE ID = seekId

Я так понял, что это для двух таблиц, а если в базе около 50 таблиц и в каждой куча записей?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.03.2006 (Пт) 16:08

Тогда обломись.
В UNION можно использовать ограниченное число таблиц, помоему до 30.
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.03.2006 (Пт) 16:08

я так и знал :!: :lol:


может стоит все-таки подумать над проектированием нормальной структуры :?:

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 31.03.2006 (Пт) 16:10

Konst_One писал(а):что-то мой инет сегодня притормаживает :cry:

Нет, это я долго печатаю ответы. Проверяю стилистику, орфографию и пунктуацию.

AndreyG_80 писал(а):
Код: Выделить всё
SELECT * FROM (SELECT * tbl1 UNION ALL SELECT * FROM tbl2) WHERE ID = seekId

Я так понял, что это для двух таблиц, а если в базе около 50 таблиц и в каждой куча записей?

Тогда VBA. Потому что слияние пятидесяти таблиц выльется в непрерывное кофепитие пользователей. :) Или менять архитектуру БД, что, как я понимаю, в данном случае не приемлемо.

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 31.03.2006 (Пт) 17:34

Всем спасибо. Я получил ответ на свой вопрос.


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

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

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

    TopList