组合1:M表并删除重复的字段

时间:2013-06-10 13:12:07

标签: sql database

是否可以在没有“产品”(column1xcolumn2)的情况下并排显示没有直接关系的2列?

检查一下。 http://sqlfiddle.com/#!3/212b6/1

我正在尝试创建一个查询,以最少的重复字段显示所有group_id,网站和历史记录。我有3个表 - 组,网站和历史,但它显示了笛卡尔加入。如果我有4个网站和1个组的3个历史记录。它显示12条记录。我想要这样的东西:

      group_id   |   website  |  History
          1         website1      hist1
          1         website2      hist2
          1         website3      hist3

1 个答案:

答案 0 :(得分:1)

您可以使用row_number()分配行号,在大多数数据库中执行此操作。这是ANSI标准功能。接近你想要的东西:

select g.group_id, w.website, h.ma_history
from (select g.*, row_number() over (order by group_id) as seqnum
      from tbl_group g
     ) g full outer join
     (select w.*, row_number() over (order by website) as seqnum
      from table_website w
     ) w
     on g.seqnum = w.seqnum full outer join
     (select h.*, row_number() over (order by ma_history) as seqnum
      from table_ma_history h
     ) h
     on h.seqnum = coalesce(g.seqnum, w.seqnum)

与所需表示的不同之处在于,“缺失”值不会从一行复制到下一行。相反,它们表示为NULL。以你的例子:

  group_id   |   website  |  History
      1         website1      hist1
      NULL      website2      hist2
      NULL      website3      hist3

既然你说“类似”,这是否足够接近?根据数据库的不同,复制值会更容易或更难。