[英]SQL JOIN in 2 tables values and get many values from one column
我有两个表,如下所示:
Antibiotics Patient
id Name id Name AntibioticA AntibioticB AntibioticC
1 A 1 John 1 2 3
2 b 2 Jim 4 2 1
3 c
4 d
我有以下问题:为了得到类似以下结果,我必须使用什么查询:
John A B C (in case id=1)
Jim D B A (in case id=2)
我的主要问题是我无法在同一列中搜索许多值。我使用了JOIN命令,但它只允许我加入一个抗生素值,因此我只接受第一个值。
select P.Name, A1.Name, A2.Name, A3.Name
From Patient p JOIN Antibiotics A1 ON (p.AntibioticA = A1.id)
JOIN Antibiotics A2 ON (p.AntibioticB = A2.id)
JOIN Antibiotics A3 ON (p.AntibioticC = A3.id)
如前所述,Patient表不是正常形式。 使用表会容易得多:
Patients (PatientName, AntiobioticID)
这样,患者可以拥有任意数量的抗生素,而不仅仅是三种(如果在现有“患者”表中允许使用NULL,则可以多达三种)。
这有意义吗?
就是这样,我们很清楚...此表设计有很多不足之处。 它不是第一范式。 如果有些病人只需要一种抗生素,而另一名病人需要7种抗生素怎么办? 另一种桌子设计...
Antibiotics Patient
AB_id AB_Name Patient_Name AB_id
1 A John 1
2 b John 2
3 c John 3
4 d Jim 4
Jim 2
Jim 1
Joe 2
SELECT p.Patient_Name AS 'Name', a.AB_Name AS 'Antibiotics'
FROM Patient p
INNER JOIN Antibiotics a ON p.AB_id = a.AB_id
ORDER BY p.Patient_Name
Output:
Name | Antibiotics
---------------------
Jim | d
Jim | b
Jim | A
Joe | b
John | A
John | b
John | c
并使其非常漂亮...
SELECT p.Patient_Name AS 'Patient',
GROUP_CONCAT(a.AB_Name SEPARATOR ', ') AS 'Antibiotics'
FROM Patient p
INNER JOIN Antibiotics a ON p.AB_id = a.AB_id
GROUP BY p.Patient_Name
Patient | Antibiotics
---------------------------------------
Jim | d, b, A
Joe | b
John | A, b, c
我希望您是SQL的新手(希望对您有所帮助),而不是一个尝试使用SQL从MongoDB或其他非SQL数据库测试概念的人。 而且,嘿,我今天学到了一些新东西...如何通过使用我的工具箱中的GROUP_CONCAT / GROUP BY使笨拙的SQL查询输出看起来更漂亮。 如果您不熟悉SQL,建议您学习如何设计数据库表,并着重于第一,第二和第三范式。
create table Antibiotics (id int, Name nvarchar(10));
insert into Antibiotics values(1, 'a');
insert into Antibiotics values(2, 'b');
insert into Antibiotics values(3, 'c');
insert into Antibiotics values(4, 'd');
create table Patient(id int, Name nvarchar(10), AntibioticA nvarchar(10), AntibioticB nvarchar(10), AntibioticC nvarchar(10));
insert into Patient values(1, 'John', 1, 2, 3);
insert into Patient values(2, 'Jim', 4, 2, 1);
/*
John A B C (in case id=1)
Jim D B A (in case id=2)
*/
SELECT t.bname,
(SELECT name FROM Antibiotics WHERE id = t.Antibiotica),
(SELECT name FROM Antibiotics WHERE id = t.Antibioticb),
(SELECT name FROM Antibiotics WHERE id = t.Antibioticc)
FROM
(SELECT a.id , a.name AS aname, b.name AS bname, b.Antibiotica, b.Antibioticb, b.Antibioticc
FROM Antibiotics a
INNER JOIN Patient b
ON a.id = b.id) t
SQLfiddle在这里: http ://sqlfiddle.com/#!6/1e642/1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.