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

时间:2013-09-17 23:12:44

标签: sql join

我有两张表如下:

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命令,但它只允许我加入一个Antibiotics值,所以我只选择第一个。

3 个答案:

答案 0 :(得分:1)

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,则最多可以有三个)。

这有意义吗?

答案 1 :(得分:0)

就这样我们很清楚......这种桌子设计有很多不足之处。它不是第一种正常形式。如果一些患者只需要一种抗生素,而另一名患者需要七种抗生素怎么办?另一种表设计......

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,我建议您学习如何设计数据库表,重点放在第一,第二和第三范式。

答案 2 :(得分:0)

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