【问题标题】:Get Unique column value along with other. Columns when using inner join获取唯一列值以及其他值。使用内连接时的列
【发布时间】:2018-03-19 20:25:51
【问题描述】:

我有以下查询,我需要列的唯一值

Select unique(t.id), log.* 
from tableA log 
inner join tableT t on t.id1=log.id1 
where log.time>=(somedate) 
and log.time<(somedate) 
and ref-id=20 
and ref-id=30 
and t.id not in (select unique t.id 
                 from   tableA log 
                 inner join tableT t on t.id1=log.id1 
                 where log.time>=(somedate) 
                 and log.time<(somedate) 
                 and ref-id=20 
                 and ref-id=30);

我没有获得 t.id 的唯一值。有人可以帮忙吗?我正在使用oracle数据库

【问题讨论】:

  • ref - id?看起来像奇怪的数学。
  • 以及加入条件。
  • 它是 ref_id。它是一个列
  • 样本数据和期望的结果真的很有帮助。 ref_id 在什么表?限定所有列引用。

标签: sql oracle11g oracle10g


【解决方案1】:

从 SELECT 中删除 LOG.*; UNIQUE(以及 DISTINCT)应用于您选择的所有列,而不仅仅是您放入括号中的列。

[编辑]

Scott 的 EMP 表包含在不同部门工作的员工。不同部门的列表是:

SQL> select distinct deptno from emp;

    DEPTNO
----------
        30
        20
        10

SQL>

如果您包含其他列,例如 JOB,则列表将更改为

SQL> select distinct deptno, job from emp order by deptno, job;

    DEPTNO JOB
---------- ---------
        10 CLERK
        10 MANAGER
        10 PRESIDENT
        20 ANALYST
        20 CLERK
        20 MANAGER
        30 CLERK
        30 MANAGER
        30 SALESMAN

9 rows selected.

SQL>

现在每个 DEPTNO 每个工作都是不同的;在这样的查询中,你不能只得到不同的 DEPTNO。

[编辑#2:聚合]

如果“distinct”表示不同的 DEPTNO 和该 DEPTNO 的第一个工作,那么您可能需要这个:

SQL> select deptno, min(job) first_job from emp
  2  group by deptno
  3  order by deptno;

    DEPTNO FIRST_JOB
---------- ---------
        10 CLERK
        20 ANALYST
        30 CLERK

SQL>

[编辑 #3,基于您的查询的示例]

Select t.id, 
       min(log.id) log_id, 
       min(log.time) log_time,
       <the rest of LOG table columns goes here, all of them with MIN>
from tableA log 
inner join table ...
<the rest of your query goes here>
group by t.id;

【讨论】:

  • 我需要日志表中的所有列以及 t.id 列中的唯一值
  • 我编辑了我的消息,添加了一个示例来说明为什么你无法得到你想要的。如果我误解了这个问题,请解释您想要得到的结果(基于 Scott 的 EMP 表;或者,如果您想获得数据,请提供测试用例 - CREATE TABLE 和 INSERT INTO 示例数据,以及期望的结果)。
  • 那么如果我们不能得到唯一的部门号那么还有其他方法吗?
  • 正如我所说:请编辑您的问题并向我们展示所需的输出。我无法想象你在说什么。
  • 根据部门和工作表我需要这样
【解决方案2】:

这样的事情怎么样?

Select t.id, log.* 
from tableA log inner join
     (select t.*, row_number() over (partition by id1 order by id) as seqnum
      from tableT t
     ) t
     on t.id1 = log.id1 
where log.time >= (somedate) and
      log.time < (somedate) and
      t.seqnum = 1
      ref_id = 20 and ref_id = 30 -- this is ALWAYS false, but I'm ignoring that

注意事项:

  • 我不知道子查询应该做什么。
  • ref_id 上的条件将始终评估为 FALSE,因此该逻辑几乎肯定不是您想要的。
  • 如果ref_id在事务表中,则条件应移至子查询。

【讨论】:

  • 抱歉。有些查询遗漏了。我的错
猜你喜欢
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多