0

そのテーブルに一時テーブルを生成するシナリオがあります....のような繰り返しの値を削除する必要があります.

id      Ref_No  css_no  haz_no  Emp_no  X-Fac       Y-Fac   Location    street_name     Locale  town_name   admin_area
341139  317000334   NULL    NULL    37101195    588550.00   185922.00       SUTTON ROAD     SOUTHEND-ON-SEA SOUTHEND-ON-SEA
477641  317000334   NULL    NULL    37100003    582297.00   582297.00   ttttttttttttttttttttttttttttttttttttttttttttttttt.....  ABERDEEN GARDENS        LEIGH-ON-SEA    SOUTHEND-ON-SEA
477641  317000334   NULL    NULL    37100003    85000.00    85000.00    ttttttttttttttttttttttttttttttttttttttttttttttttt.....  ABERDEEN GARDENS        LEIGH-ON-SEA    SOUTHEND-ON-SEA
477641  317000334   NULL    NULL    37100003    85000.00    85000.00    ttttttttttttttttttttttttttttttttttttttttttttttttt.....  ABERDEEN GARDENS        LEIGH-ON-SEA    SOUTHEND-ON-SEA
477649  317000334   NULL    NULL    37100004    591278.00   591278.00   aaaaaaaaaaaaaaaaaaaa    ACACIA DRIVE    THORPE BAY  SOUTHEND-ON-SEA SOUTHEND-ON-SEA
477651  317000334   NULL    NULL    37101738    593365.00   593365.00   adfasdsfwerwer  ADJACENT TO 51 SANDPIPER CLOSE  SHOEBURYNESS    SOUTHEND-ON-SEA SOUTHEND-ON-SEA
477661  317000334   NULL    NULL    37100036    589791.00   187149.00       ARCHER AVENUE       SOUTHEND-ON-SEA SOUTHEND-ON-SEA
487012  317000334   NULL    NULL    42203885    359280.00   359280.00   yuiuyiuy    ABERDARE CLOSE  BURTONWOOD AND WESTBROOK    WARRINGTON  WARRINGTON

このテーブルを次のように出力したい......

id      Ref_No  css_no  haz_no  Emp_no  X-Fac       Y-Fac   Location    street_name     Locale  town_name   admin_area
    341139  317000334   NULL    NULL    37101195    588550.00   185922.00       SUTTON ROAD     SOUTHEND-ON-SEA SOUTHEND-ON-SEA
    477641  317000334   NULL    NULL    37100003    582297.00   582297.00   ttttttttttttttttttttttttttttttttttttttttttttttttt.....  ABERDEEN GARDENS        LEIGH-ON-SEA    SOUTHEND-ON-SEA
                        NULL    NULL                85000.00    85000.00    
                        NULL    NULL                85000.00    85000.00    
    477649  317000334   NULL    NULL    37100004    591278.00   591278.00   aaaaaaaaaaaaaaaaaaaa    ACACIA DRIVE    THORPE BAY  SOUTHEND-ON-SEA SOUTHEND-ON-SEA
    477651  317000334   NULL    NULL    37101738    593365.00   593365.00   adfasdsfwerwer  ADJACENT TO 51 SANDPIPER CLOSE  SHOEBURYNESS    SOUTHEND-ON-SEA SOUTHEND-ON-SEA
    477661  317000334   NULL    NULL    37100036    589791.00   187149.00       ARCHER AVENUE       SOUTHEND-ON-SEA SOUTHEND-ON-SEA
    487012  317000334   NULL    NULL    42203885    359280.00   359280.00   yuiuyiuy    ABERDARE CLOSE  BURTONWOOD AND WESTBROOK    WARRINGTON  WARRINGTON

同様に、再び返される値を削除し、同じ情報を取得する必要があります...誰かこれを手伝ってくれませんか....テーブルは毎回条件に従って生成されるので、値はいつも同じではありません...

4

1 に答える 1

1

これは表示上の問題であるため、クライアント アプリケーションで処理するのが最適です。しかし、t-sql でそれを行うしかない場合は、row_number() over()を使用して、ある値の最初の出現を分離し、その後、他のすべての出現の値を空の文字列に置き換えます。

; with cte as
(
  select *,
         row_number() over(partition by id
         -- determine order by detail table.
         -- I don't know your schema.
                           order by [y-fac]) rn
    from tempTable
)
select case when rn = 1
            then convert(varchar(20), id)
            else ''
        end as id,
       case when rn = 1
            then convert(varchar(20), Ref_No)
            else ''
        end as Ref_No,
       css_no,
       haz_no,
       case when rn = 1
            then convert(varchar(20), Emp_no)
            else ''
        end as Emp_no,
       X-Fac,
       Y-Fac,
       case when rn = 1
            then Location
            else ''
        end as Location,
       case when rn = 1
            then street_name
            else ''
        end as street_name,
       case when rn = 1
            then Locale
            else ''
        end as Locale,
       case when rn = 1
            then town_name
            else ''
        end as town_name,
       case when rn = 1
            then admin_area
            else ''
        end as admin_area
from cte
order by id, rn

これは master-detail のように見えるため、これが詳細の最初の行である場合にのみ、左結合を使用してマスターに結合する挿入時に同じことを行うことができます。

; with ordered as
(
  select *,
         row_number() over (partition by master_id
                            order by detail_id) rn
    from detail
)
insert into tempTable ( ... )
select ...
  from ordered
  left join master
    on ordered.master_id = master.master_id
   and ordered.rn = 1

これにより、詳細の最初の行のみにマスター データが追加されます。他の行にはヌルが含まれます。

于 2012-09-07T23:20:24.017 に答える