74286


よく重複除去するのに

[code]

    WITH tmp AS (
     SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY uniq_column ORDER BY last_modified desc AS rn
     FROM table
    )
    
    SELECT <rn 以外のカラムがずらっと並ぶ> 
    FROM tmp
    WHERE rn = 1
    
[/code]

みたいな書き方するのですが  
カラム数が多いと記述が長くなってしまうのと  
カラムを追加する時に 最後の SELECT 文と２箇所カラム名を追加しなければいけないのでDRYじゃないです  
`SELECT * except rn FROM ...`  
みたいな書き方ってあったりしませんか？


CC BY-SA 4.0
2021-02-22T05:19:01.133
74194
2022-10-03T17:45:44.797
2021-02-22T06:54:18.987
23994
question
sql
SQL で特定のカラムを除いて select する方法ってありませんか？


残念ながら存在しません  
ガッと列名を全部コピペするのがSQL風ですね  
SQLはあまりプログラミング的な言語でないので、どうしてもそういう感じになってしまいます

記述があまりに面倒なようなら、SQL では * で取ってしまって、受け側で捨てるのもありだと思います  
ただ、列名は明記したほうが振る舞いが明確化されて、不具合などが減ると思います


CC BY-SA 4.0
2021-02-26T07:20:16.413
74286
2021-02-26T07:20:16.413
9796
74194
answer


特定のカラムを除外する方法はありません。

ただ、特定のテーブルのカラムすべてという指定はできます。  
少し処理が冗長ですが、このようにしてみるのはどうでしょうか。

[code]

    WITH tmp AS (
      SELECT
       pk, 
       ROW_NUMBER() OVER (PARTITION BY uniq_column ORDER BY last_modified desc AS rn
      FROM table
    )
    SELECT table.*
    FROM table INNER JOIN tmp ON table.pk = tmp.pk
    WHERE rn = 1
    
[/code]


CC BY-SA 4.0
2021-03-25T07:24:17.113
74886
2021-03-25T07:24:17.113
14334
74194
answer


次を実行するとテーブルtableにおけるカラムrn以外のカラム一覧(,区切り)が取得できますので  
これをサブクエリないし動的クエリの一部として使用すれば実現可能と思います。

[code]

    SELECT STRING_AGG(NAME,',') FROM SYS.COLUMNS WHERE OBJECT_ID = OBJECT_ID('table') AND NAME!='rn'
    
[/code]


CC BY-SA 4.0
2022-03-02T00:45:04.887
86638
2022-03-02T00:45:04.887
51655
74194
answer