2015-03-04 2 views
0

Может кто-нибудь помочь с синтаксисом для внешнего соединения, которое имеет несколько критериев? Я не уверен в синтаксисе для общего запроса и особенно не уверен, как добавлять критерии ко всем трем таблицам.SQL-соединение с критериями для нескольких таблиц

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

A: сотрудники (hr_empmstr)

B: выгоды (hr_beneinfo)

C: работа (hr_emppay)

A: Мне нужен список всех сотрудников (A). Мне нужно отфильтровать этот список только для активных сотрудников.

B: Для каждого сотрудника в таблице A мне нужно показать текущие избранные льготы (даже если они мне еще не нужны) на основе текущей эффективной даты в таблице преимуществ (B). Я собирался сделать это, используя что-то вроде benef_end_dt> GETDATE(). Эта таблица имеет несколько рядов на одного сотрудника, поэтому A: B - 1: много.

C: Мне нужно показать текущее название работы на основе текущей действующей даты в таблице Job (C). Эта таблица имеет несколько рядов на одного сотрудника, поэтому A: C - 1: много.

Вот что я до сих пор, но не знаете, как добавить в таблицу C и как добавить критерии для всех таблиц (активной, последней строки, и т.д. ...)

select a.id, a.name, a.type, a.gender, a.hr_status, b.bene_plan, * 
from hr_empmstr a 
left outer join hr_beneinfo b 
    on a.id = b.id 
    and b.bene_end > GETDATE() 

Пробовал подачи фотографии из таблицы, но у меня нет достаточно очков :-(

Надеются, что это дает достаточно информации. Спасибо!

+0

Можете ли вы показать, как выглядят все три таблицы, то есть какие у них столбцы? Это облегчит кому-то предложение правильно выполнить соединения. Просто посмотрев на это, я думаю, что ваше первое соединение неверно, потому что вы используете уникальные идентификаторы из обеих таблиц, а не внешние и первичные ключи. – Samo

+0

Я пытаюсь добавить скриншоты таблиц и ключей, но понятия не имею, как это сделать. Какие-нибудь советы? – Jenn

+0

Не знаете, какую ОС вы используете, но вы можете сохранить скриншот в виде файла изображения и добавить его в свой пост, щелкнув значок «Изображение» во время редактирования. – Samo

ответ

0

Если у меня есть 3 таблицы

Table a: 

id, name, type, gender, hr_status 

Table b: 

id, a_id, bene_plan, bene_end 

Table c: 

id, a_id, title 

Тогда я могу присоединиться к ним и получить соответствующую информацию следующим образом

select 
    a.*, b.bene_plan, c.job_title 
from 
    a 
left outer join 
    b on b.a_id = a.id and b.bene_end > GETDATE() 
left outer join 
    c on c.a_id = a.id 

Следует отметить, что критерии по b.bene_end также может быть в предложении where.

select 
    a.*, b.bene_plan, c.job_title 
from 
    a 
left outer join 
    b on b.a_id = a.id 
left outer join 
    c on c.a_id = a.id 
where 
    b.bene_and > GETDATE() and 
    a.hr_status = 'A' 

Update

Если вы все еще хотите видеть записи из b, когда нет соответствия a записи, вы могли бы рассмотреть возможность сделать full join

+0

Так получилось, но как добавить критерии выбора в таблицу A? Мне нужно ограничить тип сотрудников, которых я нажимаю на hr_status = 'A' и т. Д. Где я могу добавить эти критерии? Я пытался добавить его до конца, но он не работает. – Jenn

+0

Вы можете добавить их в предложение '' 'where'''. Я обновил свой пост, чтобы показать это. – Samo

+0

Да, это было основано на другом ответе, но большое спасибо, это очень помогло! – Jenn

0

Ваш на правильном пути.

select a.id, a.name, a.type, a.gender, a.hr_status, b.bene_plan, * 
from hr_empmstr a 
left outer join hr_beneinfo b 
on a.id = b.id 
left outer join hr_emppay c 
on a.id = c.id 
where b.bene_end > GETDATE() and c.job > GETDATE() 

Если у вас есть активный флаг где-то работник, как hr_status, в вашем где заявление добавьте и a.hr_status = «то, что когда-нибудь ваш активный флаг является» это должно принести все из двух таблиц.

+0

Единственная проблема, о которой я думаю, это ключи, к которым вы присоединяетесь.Мы должны использовать уникальные идентификаторы для обеих таблиц в соединении, а не внешние/первичные ключи соответствующих таблиц. – Samo

+0

ДА Это то, что мне нужно! Я пытался добавить критерии до конца раньше, но должен был иметь неправильный синтаксис. Я использовал этот оператор и добавил дополнительные критерии из таблицы A, и он сработал. – Jenn

+0

СПАСИБО! И спасибо всем остальным за ваши быстрые ответы и гениальные умы! – Jenn

0

Мы не имеем структуру Б.Д., поэтому, если мы предположим, что:

1: для каждой записи, есть только один б записей с bene_end больше к GetDate()

2: Мы есть поле «IsCurrent» в таблице с

Тогда следующий запрос будет работать:

SELECT * 
FROM hr_empmstr 
LEFT JOIN hr_beneinfo ON hr_empmstr.id = hr_beneinfo.id 
         AND hr_beneinfo.bene_end > GETDATE() 
LEFT JOIN hr_emppay  ON hr_empmstr.id = hr_emppay.id 
         --AND hr_emppay.IsCurrent = 1 
WHERE hr_empmstr.hr_status = 'A' 

Если предположение являются ложными, то вы могли бы урезать один ко многим relationshi p до 1: 1, используя подзапрос в соединении. Это дает это:

SELECT * 
FROM hr_empmstr 
LEFT JOIN hr_beneinfo ON hr_empmstr.id = hr_beneinfo.id 
         AND hr_beneinfo.unique_key = (SELECT TOP 1 B.unique_key 
                 FROM hr_beneinfo AS B 
                 WHERE B.id = hr_empmstr.id 
                 ORDER BY bene_end DESC) 
LEFT JOIN hr_emppay  ON hr_empmstr.id = hr_emppay.id 
         AND hr_emppay.unique_key = (SELECT TOP 1 C.unique_key 
                FROM hr_emppay AS C 
                WHERE C.id = hr_empmstr.id 
                ORDER BY DateFieldToReachLatest DESC) 
WHERE hr_empmstr.hr_status = 'A' 

Другим решением было бы использовать Crossjoin на QUERY наличники вниз записи до 1: 1.

Я не могу комментировать (не хватает точки):

Чтобы показать нам свою структуру БД, вы можете щелкнуть правой кнопкой на вашем столе в SQL Management Studio и нажмите кнопку «Сценарий, как» -> «Создать в». Затем скопируйте сгенерированный скрипт в свой вопрос.

+0

1. В таблице держит много строк в строке в A: от одного до многих отношений. Для каждого сотрудника они могут не иметь никаких строк выгоды, одной активной строки преимуществ или многих активных строк выгоды. Пример для меня: меня зачисляют в медицинское, стоматологическое, зрение, поэтому я появляюсь как минимум с тремя активными рядами. – Jenn

+0

Когда вы возвращаетесь к сотруднику, вам нужна вся польза или только последняя? Тот же вопрос для JobTitle. – AXMIM

+0

Я хочу все активные преимущества (которые могут быть несколько строк) и одно активное задание (последняя эффективная дата). – Jenn

Смежные вопросы