【问题标题】:Combining select and select distinct in Join在 Join 中结合 select 和 select distinct
【发布时间】:2017-07-23 15:41:13
【问题描述】:

我有 2 个可以用键链接的表。问题是 1 个表也是时间切片的。我只需要这张表中的 2 行,但它们在不同的时间重复了很多次。所以我想从这个表中选择一个不同的值并将它链接到我的另一个。 我想做什么:

SELECT a.firstcolumn,
       a.secondcolumn,
       b.somecolumn
from table1 a
INNER JOIN (SELECT DISTINCT somecolumn from table2) b
    on a.key = b.key

这段代码运行,但我得到了太多的记录(几乎是两倍),所以 distinct 没有以某种方式完成它的工作。 我希望输出包含 a.firstcolumn、a.secondcolumn 和 b.somecolumn

【问题讨论】:

  • 由于您没有选择任何 table2 列,您可以使用 EXISTS 而不是 JOIN。
  • 如果你只想2行,那为什么不试试LIMIT呢?
  • @jarlh 。 . . OP 澄清了来自 b 的列在输出中,所以我添加了它。
  • @GordonLinoff,那么 EXISTS 不能使用。
  • 是的,我确实想要第二个表的输出。我发现了一些有用的东西,但这并没有给我我需要的第二个表的输出。什么有效: 从 table1 中选择 a.firstcolumn b.firstcolumn a INNER JOIN (SELECT DISTINCT key from table2) b on a.key = b.key 如何将 b.somecolumn 添加到输出中?

标签: sql select join distinct


【解决方案1】:

评论太长了。如果您有一个时间片表,则目的是有一个日期/时间来选择值。最近的值通常是end_dt(因为缺少更好的术语)在遥远的未来或NULL 的值。

在不知道你的数据结构的情况下,我会期待这样的事情:

SELECT a.firstcolumn, a.secondcolumn, b.somecolumn
FROM table1 a JOIN 
     b 
     ON a.key = b.key AND b.end_dt IS NULL;

【讨论】:

  • 是的,我考虑过,但我不能相信数据列填写得很好。
【解决方案2】:

也许删除不同的并取日期字段的最大值(或最小值)会给你你需要的东西。

SELECT a.firstcolumn,
       a.secondcolumn,
       b.somecolumn
from table1 a
INNER JOIN (SELECT key, somecolumn, max(date) from table2 group by key, somecolumn) b
    on a.key = b.key

【讨论】:

  • 如果正确填写日期字段,这将起作用。我也有 DATETO = "99991231" 或 DATETO = "18991231" 也可能是重复的。
  • @GertKnoops 我认为即使日期不正确它仍然可以工作。只要字段是日期或数字数据类型,它只需要最大值或最小值。由于您要丢弃最终输出中的数据,因此使用日期无效的记录无关紧要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 2019-02-03
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多