繁体   English   中英

SQL JOIN 2个表中的值,并从一列中获取许多值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM