2015-09-22 3 views
0

Хорошо, я довольно отчаянным. Это мой первый раз, используя StackOverflow (я всегда нахожу все свои ответы, но не в этот раз). Пожалуйста, Сообщество Мне нужна ваша помощь, потому что я не SQL-класс. (Я использую Access).Выберите значение в другой таблице, если ссылка находится

У меня есть 3 таблицы "User", "Тип" и "User_update". Я хочу, чтобы получить значение из таблицы «User», но если есть обновление для этого пользователя в таблице «User_update» Я хотел бы иметь значение от «User_update» таблиц вместо и дату обновления. : -/

TABLE "USER" 
id | user | type_id 
-------------------- 
0 | bibi | 1 
1 | toto | 1 

TABLE "TYPE" 
id | type 
----------- 
0 | admin 
1 | normal 

TABLE "USER_UPDATE" 
id | user_id | type_id | date 
----------------------------------- 
0 | 1  | 0  | 9/3/2015 

Хотелось бы, чтобы получить что-то вроде этого:

user | type | date 
-------------------- 
bibi | normal | 
toto | admin | 9/3/2015 

Надеется, что вы, ребята, можете помочь!

+0

COALESCE? Я посмотрю на это, потому что я никогда раньше этого не видел. (Я новичок в SQL). Благодарю jarlh! –

ответ

0

Я не знаю, Access, но вот ANSI SQL Ответ:

select coalesce(uu.user, u.user), t.type, uu.date 
from user u 
    left join user_update uu on u.id = uu.id 
    join type t on t.id = coalesce(uu.type_id, u.type_id) 

LEFT JOIN есть читать из user_update, если соответствующая строка найдена. COALESCE возвращает первое ненулевое значение, поэтому, если в user_update было установлено, что значение возвращается, в противном случае user значение возвращается.

ПРИМЕЧАНИЕ: В ANSI SQL date и user являются зарезервированными словами, поэтому они, возможно, должны быть разделены, например, "date" или, возможно, [date].

попытки

доступа:

select coalesce(uu.user, u.user), t.type, uu.date 
from (user u 
     left join user_update uu on (u.id = uu.id)) 
    join type t on (t.id = coalesce(uu.type_id, u.type_id)) 

Или возможно:

select coalesce(uu.user, u.user), t.type, uu.date 
from type t 
    join (user u 
      left join user_update uu on (u.id = uu.id)) 
    on (t.id = coalesce(uu.type_id, u.type_id)) 
+0

Спасибо за ваш быстрый ответ @jarlh (я действительно впечатлен быстротой вашей помощи). Я занимаюсь этим ... чтобы добавить разделитель, но продолжайте получать ошибку. Вот запрос, который я пытаюсь сделать: SELECT COALESCE (uu.user, u.user), t.type, uu. [Date] FROM [пользователь] u LEFT JOIN user_update uu ON u.id = uu.id РЕГИСТРИРУЙТЕСЬ типа Т О t.id = COALESCE (uu.type_id, u.type_id) Когда я запускаю его я получаю следующее сообщение: "ошибка синтаксиса (отсутствующий оператор) в выражении запроса«u.id = uu.id РЕГИСТРИРУЙТЕСЬ типа Т О t.id = COALESCE (uu.type_id, u.type_id. " :-( –

+0

невных ...форматирование не работает в разделе комментариев. : -/ –

+0

Возможно, Access требует() вокруг каждого JOIN? – jarlh

0

Как кто-то новым для доступа, я бы рекомендовал вам создать большинство ваших запросов с использованием "Design View". Вы хотите, чтобы вы вошли в таблицу USER в обеих таблицах, используя USER.type_id = TYPE.id и USER.user = USER_UPDATE.user

Следующий SQL должен выполнить то, что вы хотите, возвращая запись «USER_UPDATE», если она имеют значение, иначе оно вернет запись «ТИП».

Вам нужно будет посмотреть, может ли быть несколько записей в «USER_UPDATE» для одного и того же пользователя, в зависимости от вашего использования, возврат нескольких записей может быть не тем, что вы ищете, вам нужно будет создать выберите запрос, чтобы вернуть только самую последнюю запись в «USER_UPDATE»

SELECT USER.id, USER.user, USER.type_id, IIf([USER_UPDATE].[type] Is Null, [type].[type],[USER_UPDATE].[type]) AS user_type, USER_UPDATE.date 
FROM ([USER] LEFT JOIN TYPE ON USER.type_id = TYPE.id) LEFT JOIN USER_UPDATE ON USER.user = USER_UPDATE.user; 
Смежные вопросы