【问题标题】:SQL query using data from different tables使用来自不同表的数据的 SQL 查询
【发布时间】:2015-09-16 18:37:49
【问题描述】:

我需要在 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 在这个 Table2 中。

有一个但是。例如,在表 1 中有 ID_numbers 具有时间列,如本例中的 1-5。然后是不同的 ID_numbers 以及 1-5。然后有一些 ID_numbers 在下面的 Times 列中只有例如 2、4、5。 例 2

 ID_Number       Time
    54321           2
    54321           4
    54321           5

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

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

【问题讨论】:

  • table2中的ID_Number和Code_Number有什么关系?其中一个领域是独一无二的吗?也许两者兼而有之?还是只是两者的结合?
  • 如果一个 Code_Number 可能在 table2 中出现两次,有两个不同的 ID_Numbers,一个 ID 有所有 5 次,但另一个有更少:你希望代码数字出现还是不行?
  • 这应该可以通过几乎每个 DBMS 支持的相当基本的 SQL 来解决,但无论如何:当询问 SQL 问题时,您应该始终标记您的 DBMS,因为 SQL 只是使用的语言,但它的方言不同。
  • 哦,对不起。如果你是这个意思,我正在使用 Oracle 吗?表 2 中的 ID_Number 和 Code_Number 基本上是相互关联的。 ID_Number 与 Code_Number 具有相同的行。 ID_Number 只是用于连接 ex 的值。表 1 与表 2。它们都是独一无二的。表 2 中只有一行 ID_Number 和 Code_Number 最好 Code_Number 只出现一次。基本上例如一个 ID_Number 在表 1 的 Times 列中少于 5,但它可能仍然有超过 1 行。因此,如果它只返回 Table2 中的一个 Code_Number,那就太好了。
  • 我已根据我从您的 cmets 中了解到的内容编辑了我的答案。我知道,表名和列名只是示例,但最好使用更好的名称。例如,ID_Number 最好称为ID_Table2,因为它有助于理解表之间的关系。而time 是一个奇怪的名称,用于不包含时间但包含数字的列。

标签: sql oracle


【解决方案1】:

这是我从你的 cmets 和猜测中收集到的:

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

所以你的数据模型可能或多或少是这样的:

  • table2: code_number, code_name, ... 主键 = code_number
  • table1: code_number, time, ... 主键 = code_number + time

但是你选择了一个 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)

【讨论】:

  • 您好,我已根据您上次尝试回答我的问题的评论中收集到的内容编辑了我的答案。
  • 非常感谢您向我解释。我直到下次尝试更好地解释我的想法。那天我实际上也用类似的方法弄清楚了: SELECT T2.CODENUMBER FROM TABLE2 T2, TABLE1 T1 WHERE T2.ID_NUMBER=T1.ID_NUMBER AND (SELECT COUNT(*) FROM TABLE1 T1 WHERE T1.ID_NUMBER = T2.ID_NUMBER )
  • 例如,您的解决方案不会找到存在时间 1、2、3、4 和 6 的 ID,因为尽管缺少 5,但您没有得到计数
  • 而且你不应该使用隐式逗号分隔的连接,这些连接在 20 多年前被显式连接语法所取代。请改用FROM TABLE2 T2 JOIN TABLE1 T1 ON ...。但是你为什么要加入这些表呢?这样做的唯一一件事是您不会在 table1 中获得根本没有时间条目的 ID。因此,由于不必要的连接,您甚至会得到错误的结果(即缺少记录)。
【解决方案2】:

您需要使用连接。

它看起来像:

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

a 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 语法可能会根据您使用的版本而改变。

【讨论】:

  • 好的,那我从Table2中得到那些基本上没有通过ContractID连接到Table1的?我对吗?但是如何获得这些值,这些值从 Table2 连接到 Table1,但 Times 列中的值少于 5 个? Ex1 和 Ex2 的区别。
  • 我不确定我是否完全理解了这个问题,但如果我理解正确,那么我们需要做的就是修改连接,我会更新我的答案。
  • 谢谢。基本上我需要 Table2 中的所有值,这些值在 Table1 Times 列中的值小于 1、2、3、4、5。例如,如果 Table1 中的某个 ID_Number 具有 2、3、4- 之类的值,那么我需要它。如果 Some ID_NUMBER 具有 1、2、3、4、5 之类的值,我不需要它。
  • 啊,我明白了 - 这有点复杂。让我想想:)
  • 请注意,时间列不在表 2 中。 Table1 和 Table2 仅与 ID_Number 连接。有可能这样吗?我不知道怎么写,但是:如果某些 ID_Number 在 Table1 中的 Time 值小于 5,则从 Table2 中返回值。我的意思是,这里可以使用 Count(*) 吗?
【解决方案3】:

您可以比较两个表中的counts。

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    相关资源
    最近更新 更多