我有两张表如下:
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值,所以我只选择第一个。
答案 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