【问题标题】:Add or delete repeated row添加或删除重复的行
【发布时间】:2011-01-23 20:24:15
【问题描述】:

我有这样的输出:

id  name    date        school  school1
1   john    11/11/2001  nyu ucla
1   john    11/11/2001  ucla    nyu
2   paul    11/11/2011  uft mit
2   paul    11/11/2011  mit uft

我想实现这个:

id  name    date        school  school1
1   john    11/11/2001  nyu ucla
2   paul    11/11/2011  mit uft

我直接使用join,如:

select distinct
  a.id, a.name,
  b.date,
  c.school

  a1.id, a1.name,
  b1.date,
  c1.school

from table a, table b, table c,table a1, table b1, table c1

where
a.id=b.id
and...

有什么想法吗?

【问题讨论】:

  • 格式化您的代码并提供更多信息。
  • 你如何区分学校和学校1?它们是按字母顺序排列的吗?
  • 这些列是否旨在表示 (1) 学生的 ID (2) 学生的姓名 (3) 与学生相关的某个日期 (4) 与某个学生相关联的按字母顺序排列的学校学生和 (5) 与学生相关联的按字母顺序排列的第二个学校?如果是这样,那么您可能需要进行子选择来定义第 4 列和第 5 列,除非有一些我还没有研究过的交叉表魔术。
  • 我尝试进行子选择,但它给了我一些“选择时”错误;所以我做了一个子查询,然后我离开了它。但遇到错误
  • 用更多信息编辑您的问题可能是值得的。向我们展示示例数据、表格设计、预期结果(应该对查询进行什么操作,您希望看到哪些数据,而您现在没有看到)。告诉我们你现在离开只会让我们更加复杂。如有疑问,请提供更多信息。

标签: sql duplicate-removal delete-row corresponding-records


【解决方案1】:

我们将需要更多信息,例如您的表格包含什么以及您想要什么。 我注意到的一件事是你有一所学校,然后是 school1。 3nf 指出,即使您认为关系只会是 1 或 2 个附加项目,也不应该重复字段并向它们附加数字以获取更多信息。您需要创建第二个表来存储与 1 到多个学校关联的用户。

【讨论】:

  • 我正在加入同一张表,这就是显示 school1 的原因。该表有个人信息,并将其连接到其他表。我要做的是获取有关一个人的所有信息。
【解决方案2】:

我同意其他所有人的观点,即您的源表和所需的输出都是糟糕的设计。虽然您可能无法对源表执行任何操作,但我推荐以下代码和输出:

Select id, name, date, school from MyTable;
union
Select id, name, date, school1 from MyTable;
(repeat as necessary)

这将为您提供以下格式的结果:

id  name    date        school
1   john    11/11/2001  nyu
1   john    11/11/2001  ucla
2   paul    11/11/2011  mit
2   paul    11/11/2011  uft

(注意:在我的 SQL 版本中,联合查询会自动选择不同的记录,因此不需要 distinct 标志) 使用这种格式,您可以轻松计算每个学生的学校数量、每个学校的学生数量等。

如果处理时间和/或存储空间是这里的一个因素,那么您可以将其拆分为 2 个表,1 个带有 id、name 和 date,另一个带有 id 和 school(基本上是 JonH 刚才所说的)。但是,如果您只是在处理一些简单的统计数据,这就足够了。

【讨论】:

    【解决方案3】:

    这个问题太不可抗拒了,所以我只是猜测了我们正在处理的数据结构。问题中没有具体说明该技术。这是在 Transact-SQL 中。

    create table student
    (
        id int not null primary key identity,
        name nvarchar(100) not null default '',
        graduation_date date not null default getdate(),
    )
    go
    
    create table school
    (
        id int not null primary key identity,
        name nvarchar(100) not null default ''
    )
    go
    
    create table student_school_asc
    (
        student_id int not null foreign key references student (id),
        school_id int not null foreign key references school (id),
    primary key (student_id, school_id)
    )
    go
    
    insert into student (name, graduation_date) values ('john', '2001-11-11')
    insert into student (name, graduation_date) values ('paul', '2011-11-11')
    insert into school (name) values ('nyu')
    insert into school (name) values ('ucla')
    insert into school (name) values ('uft')
    insert into school (name) values ('mit')
    insert into student_school_asc (student_id, school_id) values (1,1)
    insert into student_school_asc (student_id, school_id) values (1,2)
    insert into student_school_asc (student_id, school_id) values (2,3)
    insert into student_school_asc (student_id, school_id) values (2,4)
    
    
    
    select
        s.id,
        s.name,
        s.graduation_date as [date],
        (select max(name) from 
            (select name, 
                    RANK() over (order by name) as rank_num 
             from school sc
             inner join student_school_asc ssa on ssa.school_id = sc.id
             where ssa.student_id = s.id) s1 where s1.rank_num = 1) as school,
        (select max(name) from 
            (select name, 
                    RANK() over (order by name) as rank_num 
             from school sc
             inner join student_school_asc ssa on ssa.school_id = sc.id
             where ssa.student_id = s.id) s2 where s2.rank_num = 2) as school1
    
    from
        student s
    

    结果:

    id  name  date       school  school1 
    --- ----- ---------- ------- --------
    1   john  2001-11-11 nyu     ucla
    2   paul  2011-11-11 mit     uft
    

    【讨论】:

      猜你喜欢
      • 2014-05-05
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多