0

我有两个表如下:

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 的一个值,所以我只取第一个。

4

3 回答 3

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)

正如所指出的,患者表不是正常形式。使用表格会容易得多:

Patients (PatientName, AntiobioticID)

这样,患者可以使用任意数量的抗生素,而不仅仅是三种(如果现有 Patient 表中允许使用 NULL,则最多可以使用三种)。

这有意义吗?

于 2013-09-17T23:17:41.627 回答
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

于 2013-09-18T17:38:43.260 回答
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 新手,我建议您学习如何设计数据库表,重点是第一、第二和第三范式。

于 2013-09-18T17:13:56.750 回答