1
declare @A table (
name varchar(10)
)



declare @B table (
name varchar(10)
)


insert into @A(name) values('A')
insert into @A(name) values('A')
insert into @A(name) values('A')
insert into @A(name) values('B')
insert into @A(name) values('B')
insert into @A(name) values('B')
insert into @A(name) values('B')



insert into @B(name) values('B')
insert into @B(name) values('B')
insert into @B(name) values('B')
insert into @B(name) values('B')
insert into @B(name) values('B')
insert into @B(name) values('B')
insert into @B(name) values('B')
insert into @B(name) values('A')
insert into @B(name) values('A')

@A 有 3A 和 4B

@B 有 2A 和 7B

你可以这么说

           @A      @B
A         3          2

B          4          7

交易是我们必须将最高数字放入一张表中。

就像@A 的 3A 和 @B 的 7B 应该在一张桌子上。

@C 应该包含

@C

A
A
A
B
B
B
B
B
B
B

我想将来自@A 的A 和来自@B 的B 的内容放入表@C 中。如何?

如果可能的话,给我上面例子的最佳 sql 查询。

4

3 回答 3

4

新答案,现在要求已经明确:

;With x as (
    Select
      name,
      row_number() over (partition by name order by name) rn
    From
      @A
    Union
    Select
      name,
      row_number() over (partition by name order by name)
    From 
      @B
) 
Insert Into
    @C
Select
    name
From
    x

Example Fiddle

上一个答案:

Select
    name,
    max(c)
From (
    Select
        name,
        count(*) c
    From
        @A
    Group By
        name
    union all
    Select
        name,
        count(*)
    From
        @B
    Group By
        name
    ) x
Group By
    name

Example Fiddle

于 2013-09-15T14:46:25.330 回答
1

如果您需要使用的实际数据集确实只有一列,我相信@Laurence 的建议应该就足够了。

但是,如果他们还有其他列也需要返回,并且这些列的数据与您向我们展示的数据不同,您可以尝试这种方法:

  1. name计算每个表中每个分区的行数。

  2. 合并 ( ) 两个集合,得到合并行集中UNION ALL每个分区的最大计数值。name

  3. 获取计数值与最大值匹配的行。

这是上述的一种实现:

WITH counted AS (
  SELECT *, cnt = COUNT(*) OVER (PARTITION BY name)
  FROM A
  UNION ALL
  SELECT *, cnt = COUNT(*) OVER (PARTITION BY name)
  FROM B
),
compared AS (
  SELECT *, maxcnt = MAX(cnt) OVER (PARTITION BY name)
  FROM counted
)
SELECT name, data
FROM compared
WHERE cnt = maxcnt
;

你也可以看看这个 SQL Fiddle 演示

于 2013-09-20T05:06:40.160 回答
0

不能说你想得到什么。如果您想在一张表中获得 3 和 7 - 然后使用 Laurence 的答案,如果您希望将有问题的表作为输出,请使用以下命令:

;with cte(name, A, B) as (
    select name, name, cast(null as varchar(10)) from @A
    union all
    select name, cast(null as varchar(10)), name from @B
)
select
    name,
    count(A) as [@A],
    count(B) as [@B]
from cte
group by name

sql fiddle demo

于 2013-09-15T16:42:22.813 回答