编写查询时需要帮助

时间:2011-10-24 10:10:18

标签: sql postgresql

我有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)

但它目前正在给出正确的结果,但从长远来看,我们可能会遇到性能问题,并且查询还会检索源和目标中都不存在的数据。

3 个答案:

答案 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;
相关问题