2016-06-07 4 views
0

У меня есть три стола person_firstname, person_middlename, person_lastname. Все таблицы имеют общее поле entity_id. Я должен выбрать полное имя сотрудника в одной записи. Не уверен, что у кого-то есть только имя, имя или только фамилия. Я попытался объединить, он возвращает три строки.Как выбрать полное имя сотрудника, из трех разных таблиц

Также требуется запись конкретного сотрудника, который является entity_id. SO должно соответствовать записи типа entity_id = 123. Все имена работника которого ENTITY_ID 123.

+0

У каждого сотрудника гарантированно есть фамилия? –

+0

Ни один сотрудник не может иметь имя, последнее, среднее, все или никакое имя. Каждая вещь является необязательной. – krishnaisdinesh

+1

Вам понадобится действительно уродливый набор имитируемых внешних соединений. –

ответ

0

ВЫБРАТЬ p1.first_name person_firstname, p2.middle_name person_middlename, p3.last_name person_lastname ИЗ person_firstname p1 РЕГИСТРИРУЙТЕСЬ person_middlename p2 ON p1.entity_id = p2.entity_id РЕГИСТРИРУЙТЕСЬ person_lastname p3 ON p3. ENTITY_ID = p2.entity_id;

+0

спасибо за ответ, но он не уверен, какая таблица содержит запись один, два или все. Поэтому я думаю, что это не сработает и вам нужно будет получить конкретную запись. Как и entity_id = 123. Entity_id представляет идентификатор сотрудника. – krishnaisdinesh

+0

вы можете использовать предложение USING с entity_id, но я уверен, что он будет работать – Moreshwar

+0

для 2tables будет – Moreshwar

0
/* 
DROP TABLE PERSON_FIRSTNAME; 
DROP TABLE PERSON_SECONDNAME; 
DROP TABLE PERSON_LASTNAME; 

CREATE TABLE PERSON_FIRSTNAME (ID INT, NAME VARCHAR(20)); 
CREATE TABLE PERSON_SECONDNAME (ID INT, NAME VARCHAR(20)); 
CREATE TABLE PERSON_LASTNAME (ID INT, NAME VARCHAR(20)); 
TRUNCATE TABLE PERSON_FIRSTNAME; 
INSERT INTO PERSON_FIRSTNAME VALUES(1,'af'),(2,'bf') ; 
TRUNCATE TABLE PERSON_SECONDNAME; 
INSERT INTO PERSON_SECONDNAME VALUES(1,'as') ,(3,'cs') ; 
TRUNCATE TABLE PERSON_LASTNAME; 
INSERT INTO PERSON_LASTNAME VALUES(1,'al'),(2,'bl') ; 
*/ 

SELECT S.*, 
     PF.NAME, 
     PS.NAME, 
     PL.NAME, 
     concat(IFnull(PF.NAME,''),IFnull(PS.NAME,''),IFNULL(PL.NAME,'')) 
FROM 
(
SELECT ID FROM PERSON_FIRSTNAME 
UNION 
SELECT ID FROM PERSON_SECONDNAME 
UNION 
SELECT ID FROM PERSON_LASTNAME 
) S 
left outer JOIN PERSON_FIRSTNAME PF ON PF.ID = S.ID 
left outer JOIN PERSON_SECONDNAME PS ON PS.ID = S.ID 
left outer JOIN PERSON_LASTNAME  PL ON PL.ID = S.ID 
+0

DB является частью уже запущенного приложения. Я добавляю функцию. Поэтому для добавления функции я не могу изменить структуру db. Я думаю, что, как я описал, нет уверенности в том, что для рекордных данных будет доступна вся таблица. Если нет, то соединение не сможет получить данные в соответствии с моим пониманием. – krishnaisdinesh

+0

Вы развиваетесь на производстве? О, дорогая ... Таблицы в моем решении есть, чтобы доказать, что решение работает, и они прокомментированы. Если у вас есть среда разработки, вы должны создать таблицы и запустить выбор, чтобы помочь вам понять, что делает решение, вкратце, суб-запрос (бит с объединениями в нем) просматривает все таблицы и создает временную таблицу с идентификаторами DISTINCT во всех таблицах. Внешний запрос, затем оставленный внешним, объединяет все таблицы в подзапрос. И никакое левое внешнее соединение не терпит неудачу - левое соединение (а это не то же самое). –

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