我有2个表Table_A和Table_B。 Table_A是Table_B的父代。 Table_B有2列引用Table_A(我的意思是两列都引用Parent中的列)。
Table_A包含以下列(id,name,className) Table_B包含以下列(源,目标),这两列都引用Table_A中的id
假设Table_A
包含以下数据
id name className
---------------------------
1 N1 C1
2 N2 C2
3 N3 C3
4 N4 C4
5 N5 C6
Table_B
Source Destination
------------------
1 2
2 3
3 4
3 5
我需要一个查询,其中我需要目标中存在的所有ID而不是源,我需要使用Table_A
加入此ID以获取name和className。
对于我显示的数据,查询应检索以下行。
4 N4 C4
5 N5 C5
顺便说一句,我在这里展示了部分数据,但Table_B
有超过1000条记录。
修改
我写了以下查询,但结果显示错误
select * from Table_A where id not in (select distinct Source from Table_B)
但它目前正在给出正确的结果,但从长远来看,我们可能会遇到性能问题,并且查询还会检索源和目标中都不存在的数据。
答案 0 :(得分:5)
我只安装了SQLite,但这个简短的查询完成了这项工作:
SELECT table1.id, table1.name
FROM table1, table2
WHERE table2.destination NOT IN
(SELECT DISTINCT source FROM table2)
AND table1.id=table2.destination;
-- Result:
-- 4|N4
-- 5|N5
编辑:当然,与其他解决方案进行性能比较会很有趣。
答案 1 :(得分:2)
您需要将问题分成两部分,第一部分是获取不在源中的目标,第二部分是连接两个表。 为了获得不在源中的目的地,这样的事情应该有效:
SELECT Destination FROM Table_B WHERE Destination NOT IN (SELECT Source AS Destination FROM Table_B)
然后我们需要的是连接,所以
SELECT Table_A.* FROM Table_A
JOIN Table_B on Table_A.id = Table_B.Destination
WHERE Destination NOT IN (SELECT Source AS Destination FROM Table_B)
我不能认为这是正确的,因为我目前无权访问数据库或查询分析器,但它应该让你走上正确的轨道。
答案 2 :(得分:1)
WITH T1 (id)
AS
(
SELECT Destination
FROM Table_B
EXCEPT
SELECT Source
FROM Table_B
)
SELECT T2.id, T2.name, T2.className
FROM T1 NATURAL JOIN Table_A AS T2;