我正在为医疗中心建立一个数据库。在我的情况下,我需要使用2个表获取数据。我有两个名为Consultation
和Channeling
的表。在我的情况下,当患者放置新的通道时,它将自动添加到咨询表中。然后,当患者完成咨询时,该咨询记录将被删除。但是Channeling
记录没有删除(根据商业案例)。我需要从Channeling
表格中的 Not Existing 的Consultation
记录中提取记录。我试过这个,
SELECT c.* FROM Channeling c, Consultation cn WHERE c.cid!=cn.cid
cid
是Channeling
表的主键。它是Consultation
的外键。当我使用此查询时,我有700多条记录。但在我的Channelin
表中只有75条记录。我怎么能这样做可能吗?我正在使用mysql数据库。
提前致谢!
答案 0 :(得分:0)
将您的查询视为由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的频道和咨询元素的所有组合
比:
选择通道中不存在的所有元素
答案 1 :(得分:0)
您选择每个可能的咨询和通道组合,然后过滤掉具有相同ID的组合。
尝试这样的事情:
SELECT * FROM Channeling WHERE cid NOT IN (SELECT cid FROM Consultation)
答案 2 :(得分:0)
您正在使用两个表的笛卡尔积,然后选择条件为c.cid=cn.cid
的记录。您可以通过左连接两个表来完成此操作。这将返回所有通道记录,然后选择具有咨询的Id列为空的记录。喜欢这个
SELECT c.*
FROM Channeling c
LEFT JOIN Consultation cn
ON c.cid = cn.cid
WHERE cn.cid IS NULL