说我有下一个表:药物和客户:
idNum | drugName
118 | drug1
118 | drug2
120 | drug1
120 | drug2
120 | drug3
121 | drug1
121 | drug3
122 | drug2
客户端:
idNum | Name | lastName |
118 | name1 | last1 |
119 | name2 | last2 |
120 | name3 | last3 |
121 | name4 | last4 |
122 | name5 | last5 |
我想创建一个新表,其中包含使用idNum ='118'的客户使用相同药物的客户的所有ID,姓名和姓氏
这意味着我需要一张只有'120'的桌子。
到目前为止我已经:
SELECT Clients.idNum,firstName, lastName
FROM Clients, Drugs
WHERE Drugs.idNum=Clients.idNum
AND Clients.idNum<>'118'
AND Clients.idNum IN
(Select idNum From Drugs Where drugName IN
(Select drugName from Drugs where idNum='118'))
但是这给了我121和122。 我猜'IN'就像'存在',所以如果有人只有一种药物就足够了。我如何实际比较从这里得到的表格:
(Select drugName from Drugs where idNum='118')
到'药物'中的一个字段?
或许,我如何为每个客户创建一个表,然后将其与表进行比较?
答案 0 :(得分:0)
这是一个棘手的查询。该想法是为与客户端118匹配的每个客户端生成药物列表。这是“主”列表。然后,使用left outer join
为每个客户带来实际药物。当匹配失败时,请过滤掉客户端:
select master.idNum, master.firstName, master.lastName
from (select d.drugName, c.*
from Drugs d cross join
Clients c
where d.idnum = 118
) master left outer join
Drugs d
on master.drugName = d.drugName and
master.idNum = d.idNum
group by master.idNum, master.firstName, master.lastName
having count(d.drugName) = count(master.drugName);
SQL小提琴是here。如果要另外过滤掉客户端118,则将嵌套的where子句更改为d.idnum = 118 and c.idnum <> 118
。
您还应该学习正确的连接语法和表别名的使用。