
以下の内容の追加質問です。
http://oshiete.goo.ne.jp/qa/9224819.html
ご回答いただいた内容でデータの抽出がうまくできましたが、実はもう一つの悩みがあります。
テーブルT1とT2の列は可変です。
ユーザーの操作によって、列の添削ができますので、列を変数にしてさらに前回の回答に列の代わりに変数を使ってデータの抽出ができないでしょうか。
どうぞご教授をお願いします。
No.2ベストアンサー
- 回答日時:
デバッグ実行とか、プロファイラとかで ②の EXECでどんなSQLを実行しているか、確認してはどうです?
@colNameが COL だったとすると
@preDataColはT1.COL
@postDataColはT2.COL
になって、②のSQLが
SELECT
COL As ColumnName,
T1.COL AS PreData,
T2.COL AS AfterData
FROM T1,T2
WHERE T1.BusinessName = T2.BusinessName
AND T1.COL<>T2.COL
となる、ということは理解できてますか?
これだと COL As ColumnName のCOLがT1.COLとT2.COLの2つの候補があるので「曖昧」だ、ということは理解できますか?
「ColumnName」という名前から推測するに
SELECT
'COL' As ColumnName,
T1.COL AS PreData,
T2.COL AS AfterData
FROM T1,T2
WHERE T1.BusinessName = T2.BusinessName
AND T1.COL<>T2.COL
というSQLにするつもりだったのでは?
自分で書いといてなんですが
これって、SQLインジェクションの危険があります。
気を付けてください。
やはり、列名をユーザーが自由に変えられる、というのは問題だと思います。
Kmee 様
おっしゃるどおり、
SELECT
'COL' As ColumnName,
T1.COL AS PreData,
T2.COL AS AfterData
FROM T1,T2
WHERE T1.BusinessName = T2.BusinessName
AND T1.COL<>T2.COL
のSQLにするつもりでした。
外部から列の添削について再度検討いたします。
ただ、列が変わらなくても、300以上の列があるので、
1つずつ、値を比較して結果をUNIONしていくにもあれなので、もう少しよみやすいクエリをしたく、
動的SQLを考えたんですが、躓いたわけです。
COLではなくて、'COL' にすれば、エラーが発生しないでしょうか。
変数の宣言はそもそも文字型なので、'COL' にする方法がわからないです。
大変恐縮ですが、ご教授いただけますでしょうか。
No.1
- 回答日時:
> テーブルT1とT2の列は可変です。
まずは、そんなテーブル定義がしょっちゅう変化するような設計自体を変えるべきじゃないですかね?
テーブルの定義は Item1,Item2といった列名をそのままにして、
Item1 as ユーザーが変更した名前, Item2 as ユーザーが変更した名前2,..
となるビューを使うとか。
@c1='item1'
@c2='item1'
としたら、
@s = 'SELECT (以下略) と、前質問のSQLと同じ文字列になるようにして、
execute @s
で実行する、って方法はありますが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数ファイルのデータの統合について 12 2022/05/14 12:03
- その他(データベース) 20万行あるデータを動かしたい 2 2023/06/13 15:21
- Excel(エクセル) Power Query でのデータの一括修正について 2 2022/05/10 02:00
- Excel(エクセル) Excelの数式についての質問 1 2022/10/31 15:50
- Excel(エクセル) Excelの関数でこんな処理ができますか 1 2023/02/08 13:46
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- Visual Basic(VBA) VBA 「,」・空白・カタカナ等の複数条件のマクロ 2 2023/08/23 11:57
このQ&Aを見た人はこんなQ&Aも見ています
-
列名に変数を使うことはできないのでしょうか?
SQL Server
-
検索結果の列数を動的に変更したい
SQL Server
-
SQLのクエリ、又はプロシージャで変更前と変更後の値だけ抽出して新しいテーブルに格納したい
SQL Server
-
-
4
【PL/SQL】FROM区に変数を使う方法
Oracle
-
5
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
6
【Transact-sql】 execの結果をoutputパラメータに持たせたい
SQL Server
-
7
フィールド名を変数で指定するには
MySQL
-
8
Accessでフィールド名を変数(文字列)で・・・
Access(アクセス)
-
9
ユーザー定義関数内でのsp_executesqlプロシージャの使用
SQL Server
-
10
テーブル名が可変の場合のクエリの書き方
MySQL
-
11
SELECTで1件のみ取得するには?
Oracle
-
12
カーソル0件の時にエラーを発生させる
Oracle
-
13
クエリビルダで列名を変数にしたいが
SQL Server
-
14
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
15
MS SQLServer のSQLで文字列の前にN:
その他(データベース)
-
16
PLSQLでフィールド名の参照について
Oracle
-
17
テーブル名が可変の動的SQLをファンクションにしたい
Oracle
-
18
テーブルの列名をデータとして設定しておき取得する
Oracle
-
19
PL/SQLカーソルの2重FORループができません
Oracle
-
20
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL文の関数らしいのですが、意...
-
ふと疑問
-
Excel の簡単な操作について
-
【VB.NET】日付型の列にNULLを...
-
SQL文をご教授願います
-
SQL SELECT文について
-
AccessのデータをExcelに抽出
-
MySQLでフィールドを消す方法が...
-
エクセルでワイルドカード検索...
-
EXCEL 集計の方法
-
UPDATE文のWHERE条件に他のテー...
-
Access2003 テーブル内の列を...
-
列のヘッダーを含めるのをデフ...
-
定型メールからデターベースに...
-
javaAPIを使いこなすには
-
秒数をDATETIME型に変換して足...
-
英語での答え方はこれで正解で...
-
複数のフィールドからデータを...
-
noの用法について
-
行数の取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
外部参照してるキーを主キーに...
-
SELECT 文 GROUP での1件目を...
-
UPDATE文のWHERE条件に他のテー...
-
SQLで列名を変数にできないでし...
-
列のヘッダーを含めるのをデフ...
-
列番号による項目の取得について
-
【VB.NET】日付型の列にNULLを...
-
Access:クエリーにて集計後に...
-
テーブル列数とデータファイル...
-
SQLによる"あいうえお"順でソー...
-
Accessでの全データから空白削除
-
特定の列だけをGROUP BYしたい時
-
項目名に大文字と小文字の混在...
-
特定の文字列で列を区切るには?
-
エクセルの列見出しが飛んでいます
-
Oracle8でテーブルの列名を変更...
-
複数列の最大値を求めたい
-
”+”の符号をつける方法
-
IDENTITY列の更新で失敗する
-
SELECT文で列名指定して桁あわ...
おすすめ情報
次のようにためしてみたが、「列名があいまい」というエラーで実行できませんでした。
おわかりの方がいらっしゃればご教授をお願いします。
①
Declare @preDataCol nvarchar(40)
Declare @afterDataCol nvarchar(40)
SET @cnt = 2
SELECT @colName = COL_NAME(OBJECT_ID('T1'), @cnt)
SELECT @preDataCol = 'T1.' + @colName
SELECT @afterDataCol = 'T2.' + @colName
②
EXEC (
' SELECT ' +
@colName + ' AS ColumnName ' +
', ' + @preDataCol + ' AS PreData ' +
', ' + @afterDataCol + ' AS AfterData ' +
' FROM T1 , T2 ' +
' WHERE T1.BusinessName = T2.BusinessName ' +
' AND ' + @preDataCol + ' <> ' + @afterDataCol
)
文字型にする問題が自己解決したので質問をクローズします。アドバイスをいただいたkmee様に感謝します。