Если логика в запросах SQL или Access - PullRequest
3 голосов
/ 05 ноября 2010

Приветствую, товарищи ТАК люди.

Я работаю над проектом, в котором я работаю с базой данных Access. Вот настройки:

У меня есть три таблицы:

Tab1 with employee names, ID#s, Manager names and Manager ID#s.
Tab2 with chat info, employee ID#s and employee names.
Tab3 with Manager ID#s, Manager names and team names.

В настоящее время у меня есть запрос, который выбирает следующее:

tab2.[employee name], tab2.[employee id], tab3.[chat info], tab1.[manager id], tab1.[manager id], tab3.[team name]
where
tab2.[employee id] = tab1.[employee id] and tab2.[manager id] = tab3.[manager id];

То, что я пытаюсь сделать, заключается в следующем: я хотел бы иметь способ поместить «Неизвестно» в поле «Команда», если идентификаторы не совпадают где-то вдоль линии. Есть идеи?

Заранее спасибо!

Ответы [ 5 ]

5 голосов
/ 05 ноября 2010

Возможно что-то вроде:

select tab2.[employee name], 
       tab2.[employee id], 
       tab3.[chat info], 
       tab1.[manager id], 
       Nz(tab3.[team name], 'Unknown') as [team name]
    from (tab2
        left join tab1
            on tab2.[employee id] = tab1.[employee id])
        left join tab3
            on tab2.[manager id] = tab3.[manager id]
1 голос
/ 05 ноября 2010
SELECT
   tab2.[employee name], tab2.[employee id], 
   tab3.[chat info], tab1.[manager id], 
   tab1.[manager id], 
   Nz(tab3.[team name],"Unknown")
FROM (tab2 
LEFT JOIN tab1 
ON tab2.[employee id] = tab1.[employee id]) 
LEFT JOIN tab3 
ON tab2.[manager id] = tab3.[manager id];
0 голосов
/ 05 ноября 2010

Хорошо, я не спешил с тем фактом, что вы не можете использовать CASE, и использование Джо Nz, вероятно, является вашим лучшим выбором, но здесь есть другая альтернатива для конкретного случая, представленная здесь в случае, если она соответствует вашей ситуации.лучше:

select tab2.[employee name],
       tab2.[employee id],
       tab3.[chat info],
       tab1.[manager id],
       Iif(IsNull(tab3.[team name]), 'Unknown', tab3.[team name]) as [team name]
    from tab2
        left join tab1
            on tab2.[employee id] = tab1.[employee id]
        left join tab3
            on tab2.[manager id] = tab3.[manager id]

В этой ситуации Iif (условие , trueAnswer, falseAnswer ) делает то же самое, что и Nz, но если ваше условие является чем-то помимоIsNull может быть более гибким.

0 голосов
/ 05 ноября 2010

Кажется, что Access не поддерживает операторы SQL, поэтому мой предыдущий ответ неверен.Я оставляю его там для тех, кто ищет ту же проблему с SQL-совместимой базой данных.

Очевидно, вы можете использовать оператор switch для достижения того же результата;этот пример показывает , как можно использовать переключатель .Надеюсь, это более полезно.

В противном случае, если возможно, переключитесь на реальную БД:)

0 голосов
/ 05 ноября 2010

Я не уверен насчет Access, но в SQL обычно вы бы оставляли свои таблицы вместе, и вы можете использовать оператор CASE для добавления условного поведения, которое вы ищете;доступ может не поддерживать это.

Показанный пример здесь является достаточно стандартным.

Ого, действительно ли запросы доступа выглядят так?Хммм ... Тогда, может быть, что-то вроде этого.

tab2.[employee name], tab2.[employee id], tab3.[chat info], tab1.[manager id], tab1.[manager id], case when tab3.[team name] is null then 'Unknown' else tab3.[team name] end as [team name]
where
tab2.[employee id] = tab1.[employee id] and tab2.[manager id] = tab3.[manager id];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...