SQL查询复制记录

时间:2015-11-06 13:37:26

标签: sql oracle plsql

我有两张桌子。 我们称之为table_A和table_B。

Table_B包含table_A的ForeignKey。

SELECT a.name
FROM table_a a, table_b b
WHERE a.id != b.table_a_fk

现在我想从table_a中获取所有名称,因为IF table_b不包含table_a中记录的ID。

我已经尝试过这个问题:

$.proxy

通过此查询,我得到了正确的结果,我只得到了5次这样的结果,我不知道为什么。

希望有人能解释一下。

2 个答案:

答案 0 :(得分:1)

使用distinct

SELECT distinct  a.name
FROM table_a a, table_b b
WHERE a.id != b.table_a_fk

或更好的是......

Select distinct name
from tableA a
Where not exists (Select * from tableB 
                  Where table_a_fk = a.id)

答案 1 :(得分:1)

您的查询会在两个表AB之间创建cartesian product。笛卡尔积是生成这些重复值的产品。相反,您希望使用anti-join,这通常使用NOT EXISTS

在SQL中编写
SELECT a.name
FROM table_a a
WHERE NOT EXISTS (
  SELECT *
  FROM table_b b
  WHERE a.id = b.table_a_fk
)

使用NOT INonly if table_b.table_a_fk is NOT NULL)表达反联接的另一种方式:

SELECT a.name
FROM table_a a
WHERE a.id NOT IN (
  SELECT b.table_a_fk
  FROM table_b b
)

表达反连接的另一种不太常见的方式:

SELECT a.name
FROM table_a a
LEFT OUTER JOIN table_b b ON a.id = b.table_a_fk
WHERE b.id IS NULL