使用来自不同表的数据的SQL查询

时间:2015-09-14 13:02:43

标签: sql oracle

我需要在SQL Developer中创建一个查询。 有表1。表1中的数据如下: 实施例1,

ID_Number       Time
12345           1
12345           2
12345           3
12345           4
12345           5
67890           1
67890           2
67890           3
etc.

此Table1使用此ID_Number连接到Table2,我需要的Code_Number在此表2中。

有一个但是。例如,在表1中,存在具有时间列的ID_number,在此示例中为1-5。然后不同的IDnumbers也来自1-5。然后有一些IDnumbers,在Times列中只有例如2,4,5,如下所示。 例2

 ID_Number       Time
    54321           2
    54321           4
    54321           5

我需要创建一个查询,从Table2中取出所有Code_Numbers(通过ID_number连接到Table1),但只有那些不具备1-5(Ex.1)中所有ID_numbers的那些。

有没有办法让这个查询成为可能?如果我知道它们有一定数量。例如5,所以也许我可以选择内部选择,如果例如小于5,那么它会为我返回这些Code_Numbers吗?

3 个答案:

答案 0 :(得分:2)

这是我从您的评论和猜测中收集的内容:

  • table2中的Code_Number是唯一的。
  • table2中的ID_Number是唯一的。
  • table1中的ID_Number是table2的ID,当然在table1中不唯一。
  • 表1中的组合ID_Number +时间是唯一的。

因此,您的数据模型可能或多或少:

  • table2:code_number,code_name,... Primary Key = code_number
  • table1:code_number,time,...主键= code_number +时间

但是你选择了ID概念,所以你得到了:

  • table2:id_number,code_number,code_name,...主键= id_number,code_number上的附加唯一约束
  • table1:id_number,time,...主键(或至少一个唯一约束)= id_number + time

表和列的名称更好:

  • 代码:id_code,code_number,code_name,... PK = id_code,code_number上的唯一索引
  • code_times:id_code_time,id_code,time_number,... PK = id_code_time,id_code + time_number上的唯一索引

是?然后,您将从代码表中进行选择,但排除code_times表中存在所有请求的时间数的记录。要查找包含所有时间编号的id_number,请按id_number分组并计算不同的时间编号。然后使用找到的ID访问table2。

select code_number
from table2
where id_number not in
(
  select id_number
  from table1
  where time in (1,2,3,4,5)
  group by id_number 
  having count(*) = 5
);

如果code_number / time对可以在table1中出现多次,则将count(*)替换为count(distinct time)

答案 1 :(得分:0)

您需要使用联接。

看起来像是:

SELECT t2.*
FROM t1
RIGHT OUTER JOIN t2 on t1.ID = t2.ID
WHERE t1.ID IS NULL

a RIGHT OUTER JOIN告诉SQL保留RIGHT手表上不匹配的行,方法是在左手表的数据中加入NULL。

然后我们过滤左表为NULL的位置,因此我们得到左表中不存在的结果。

根据评论更新了SQL:

SELECT t2.*
FROM t1
RIGHT OUTER JOIN t2 on t1.ID = t2.ID 
    AND t1.Time = t2.Time
WHERE t1.ID IS NULL

另请注意,SQL语法可能会根据您使用的版本而更改。

答案 2 :(得分:0)

您可以比较两个表中的count

Fiddle

select t2.id 
from t2 
group by t2.id 
having count(*) < (select count(*) from t1  where t1.id = t2.id group by t1.id)