我在为一个医疗中心建一个数据库。在我的例子中,我需要使用两个表来获取数据。我有两个表,名为Consultation和Channeling。在我的情况下,当病人放置一个新的通道,它将自动添加到会诊表。然后,当病人进行咨询时,咨询记录就会被移除。但是Channeling记录并没有删除(根据业务案例)。我需要从Channeling记录中获取记录,即在Consultation表中不存在。我试过用这个,
SELECT c.* FROM Channeling c, Consultation cn WHERE c.cid!=cn.cidcid是Channeling表的主键。它是Consultation的外键。当我使用这个查询时,我得到了700+记录。但是在我的Channelin表中只有75条记录。我怎么能这么做。有可能吗?我在使用mysql数据库。
提前谢谢!
发布于 2014-04-08 07:57:37
假设您的查询是由WHERE子句过滤的笛卡尔产品。所以这就像得到75 x Consultation records count记录,然后丢弃所有这些组合
c.cid=cn.cid这就是为什么您获得的元素比Channelin多。
为了得到你想要的,你可以尝试:
SELECT c.* FROM Channeling c WHERE 0 = (SELECT COUNT(1) FROM Consultation cn WHERE cn.cid=c.cid);或者:
SELECT c.* FROM Channeling c WHERE c.id NOT IN (SELECT DISTINCT cn.id FROM Consultation cn);情况并不相同:
选择具有不同id的通道和咨询元素的所有组合
超过:
从渠道中选择所有不在协商中的要素
发布于 2014-04-08 07:58:45
您将选择每一个可能的协商和通道组合,然后过滤出具有相同ID的那些。
试着做这样的事情:
SELECT * FROM Channeling WHERE cid NOT IN (SELECT cid FROM Consultation)发布于 2014-04-08 08:07:13
您正在执行两个表的笛卡儿积,然后选择具有条件c.cid=cn.cid的记录。您可以通过向左连接两个表来完成这一任务。这将返回所有通道记录,然后选择具有咨询Id列null的记录。像这样
SELECT c.*
FROM Channeling c
LEFT JOIN Consultation cn
ON c.cid = cn.cid
WHERE cn.cid IS NULLhttps://stackoverflow.com/questions/22930885
复制相似问题