繁体   English   中英

使用不同表中的数据进行SQL查询

[英]SQL query using data from different tables

我需要在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.

该表1通过此ID_Number连接到表2,而我需要的代码号在此表2中。

但是有一个。 例如,在表1中,有ID_numbers,其中具有Time列,如本示例中从1-5所示。 然后是不同的ID_number,也从1-5开始。 然后在下面的“时间”列中有一些ID_number仅具有例如2、4、5。 例2

 ID_Number       Time
    54321           2
    54321           4
    54321           5

我需要创建一个查询,该查询从Table2(通过ID_number连接到Table1)中删除所有Code_Number,但仅查询那些没有1-5(示例1)中所有ID_number的代码。

有什么办法可以使该查询成为可能? 如果我知道有一定数量的话。 例如5,所以也许我可以将它们与内部选择组合起来,例如,如果少于5,那么它将为我返回这些Code_Numbers吗?

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

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

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

  • table2:代号,代号,...主键=代号
  • table1:代码编号,时间,...主键=代码编号+时间

但是您采用了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
);

如果在表1中一个code_number / time对可以出现多次,则用count(distinct time)替换count(*) count(distinct time)

您需要使用联接。

它看起来像:

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

RIGHT OUTER JOIN告诉SQL通过在左手表的数据中放入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语法可能会根据所使用的版本而变化。

您可以通过比较两个表中的count来执行此操作。

小提琴

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM