我需要在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吗?
答案 0 :(得分:2)
这是我从您的评论和猜测中收集的内容:
因此,您的数据模型可能或多或少:
但是你选择了ID概念,所以你得到了:
表和列的名称更好:
是?然后,您将从代码表中进行选择,但排除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
。
select t2.id
from t2
group by t2.id
having count(*) < (select count(*) from t1 where t1.id = t2.id group by t1.id)