[英]SQL Select from 2 tables with same column names only return column when not null
[英]SQL select from 3 tables and merge column names
我正在嘗試從MySQL的3個表中獲取數據並更改/合並它們的列名。 現在,當我使用AS
設置列名稱時,它們會重復出現。
人表:
id applicant_id employee_id
---------------------------------
1 3 6
2 4 10
3 12 30
申請人表:
id applicant_id applicant_note applicant_note_date
-----------------------------------------------------------
1 3 "Was good" 2013-05-01
1 4 "Was so-so" 2013-06-07
2 4 "Was bad" 2013-06-08
3 4 "Was great" 2013-06-10
員工表:
id employee_id employee_note employee_note_date
--------------------------------------------------------
1 10 "Was ok" 2013-07-20
1 10 "Was great" 2013-07-21
2 30 "Was bad" 2013-08-01
3 30 "Was so-so" 2013-08-02
我僅有的是employee_id
。 我想確保我從雇員和求職者那里都得到了所有便箋,並且希望將它們合並到同一列中,而不要使用具有NULL
值的重復列。 我想返回如下結果:
note date type
------------------------------------------------
"Was so-so" 2013-06-07 applicant
"Was bad" 2013-06-08 applicant
"Was great" 2013-06-10 applicant
"Was ok" 2013-07-20 employee
"Was great" 2013-07-21 employee
我現在的位置是:
SELECT
applicants.applicant_note AS note,
applicants.applicant_note_date AS date,
employees.employee_note AS note,
employees.employee_note_date AS date
IF(applicants.applicant_id IS NULL, 'employee', 'applicant') as type
FROM
employees
JOIN
people
ON
people.employee_id = employees.employee_id
JOIN
applicants
ON
applicants.applicant_id = people.applicant_id
WHERE
employees.employee_id = 10
有沒有辦法僅使用SQL來完成此任務? 還是我必須運行單獨的查詢才能獲得申請人ID和員工ID?
您需要使用UNION ALL
SELECT employee_note note,
employee_note_date date,
'employee' type
FROM people a
INNER JOIN employees b
ON a.employee_ID = b.employee_ID
WHERE a.employee_ID = 10
UNION ALL
SELECT applicant_note note,
applicant_note_date date,
'applicant' type
FROM people a
INNER JOIN applicants b
ON a.applicant_id = b.applicant_id
WHERE a.employee_ID = 10
最簡單的方法是復制您要求的內容,以使用UNION。 您可以從employees表中使用employee_id = 10。 對於申請人,您可以使用子查詢,其中從employee_id = 10的人員表中提取applicant_id。
SELECT employee_note note,
employee_note_date date,
'employee' type
FROM employees e
WHERE e.employee_id = 10
UNION
SELECT applicant_note note,
applicant_note_date date,
'applicant' type
FROM applicants a
WHERE applicant_id = (SELECT applicant_id FROM people WHERE employee_id = 10)
使用JOIN的一個優點是可以將查詢轉換為派生表,從而允許在查詢末尾用一個位置指示employee_id(或通過稍作修改將列表限制為applicant_id或people.id)。 此外,該表還可以包含people.id,以確保在查詢中顯示正確的人。 例如:
SELECT * FROM (
SELECT p.id person,
employee_note note,
employee_note_date date,
'employee' type
FROM employees e
JOIN people p on p.employee_id = e.employee_id
UNION
SELECT p.id person,
applicant_note note,
applicant_note_date date,
'applicant' type
FROM applicants a
JOIN people p on p.applicant_id = a.applicant_id
) q
WHERE q.person in(SELECT id FROM people WHERE employee_id = 10)
創建三個表的語句如下。
CREATE TABLE `people` (`id` int(11) NOT NULL, `applicant_id` int(11) NOT NULL,
`employee_id` int(11) NOT NULL, PRIMARY KEY (`id`),
KEY `applicant_id_index` (`applicant_id`),
KEY `employee_id_index` (`employee_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `employees` (`employees_id` int(11) NOT NULL AUTO_INCREMENT,
`id` int(11) NOT NULL, `employee_id` int(11) NOT NULL,
`employee_note` varchar(12) DEFAULT NULL,
`employee_note_date` datetime DEFAULT NULL,
PRIMARY KEY (`employees_id`),
KEY `employee_id_index` (`employee_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
CREATE TABLE `applicants` (
`applicants_id` int(11) NOT NULL AUTO_INCREMENT,
`id` int(11) NOT NULL,
`applicant_id` int(11) NOT NULL,
`applicant_note` varchar(12) DEFAULT NULL,
`applicant_note_date` datetime DEFAULT NULL,
PRIMARY KEY (`applicants_id`),
KEY `applicant_id_index` (`applicant_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
INSERT INTO `employees` VALUES (1,1,10,'Was ok','2013-07-20 00:00:00'),
(2,1,10,'Was great','2013-07-21 00:00:00'),(3,2,30,'Was bad','2013-08-01 00:00:00'),
(4,3,30,'Was so-so','2013-08-02 00:00:00');
INSERT INTO `people` VALUES (1,3,6),(2,4,10),(3,12,30);
INSERT INTO `applicants` VALUES (1,1,3,'Was good','2013-05-01 00:00:00'),
(2,1,4,'Was so-so','2013-06-07 00:00:00'),
(3,2,4,'Was bad','2013-06-08 00:00:00'),
(4,3,4,'Was great','2013-06-10 00:00:00');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.