
以下の内容の追加質問です。
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
列名に変数を使うことはできないのでしょうか?
SQL Server
-
検索結果の列数を動的に変更したい
SQL Server
-
SQLのクエリ、又はプロシージャで変更前と変更後の値だけ抽出して新しいテーブルに格納したい
SQL Server
-
-
4
【PL/SQL】FROM区に変数を使う方法
Oracle
-
5
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
6
テーブル名が可変の場合のクエリの書き方
MySQL
-
7
Accessでフィールド名を変数(文字列)で・・・
Access(アクセス)
-
8
【Transact-sql】 execの結果をoutputパラメータに持たせたい
SQL Server
-
9
ユーザー定義関数内でのsp_executesqlプロシージャの使用
SQL Server
-
10
SELECTで1件のみ取得するには?
Oracle
-
11
テーブル名が可変の動的SQLをファンクションにしたい
Oracle
-
12
カーソル0件の時にエラーを発生させる
Oracle
-
13
MS SQLServer のSQLで文字列の前にN:
その他(データベース)
-
14
クエリビルダで列名を変数にしたいが
SQL Server
-
15
フィールド名を変数で指定するには
MySQL
-
16
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
17
Oracle 2つのDate型の値の差を「分」で取得したい
その他(データベース)
-
18
PL/SQLカーソルの2重FORループができません
Oracle
-
19
GROUP BYを行った後に結合したい。
Oracle
-
20
PLSQLでフィールド名の参照について
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
外部参照してるキーを主キーに...
-
SELECT 文 GROUP での1件目を...
-
UPDATE文のWHERE条件に他のテー...
-
列番号による項目の取得について
-
Access:クエリーにて集計後に...
-
SQLで列名を変数にできないでし...
-
”+”の符号をつける方法
-
列のヘッダーを含めるのをデフ...
-
SQLite3 の UpdateCommand エラー
-
SQLでどうやったらできますか?
-
Accessのリストボックスについて
-
項目名に大文字と小文字の混在...
-
【VB.NET】日付型の列にNULLを...
-
IDENTITY列の更新で失敗する
-
フィルターかけた後、重複を除...
-
差し込み後、元データを変更し...
-
SQLで特定の項目の重複のみを排...
-
エクセルで最後の文字だけ置き...
-
SQLにて特定の文字を除いた検索...
-
SQL Left Join で重複を排除す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
外部参照してるキーを主キーに...
-
SELECT 文 GROUP での1件目を...
-
UPDATE文のWHERE条件に他のテー...
-
SQLで列名を変数にできないでし...
-
列番号による項目の取得について
-
列のヘッダーを含めるのをデフ...
-
Access:クエリーにて集計後に...
-
【VB.NET】日付型の列にNULLを...
-
SQLによる"あいうえお"順でソー...
-
テーブル列数とデータファイル...
-
Excel の簡単な操作について
-
ふと疑問
-
特定の文字列で列を区切るには?
-
v$processのPROGRAM列に関する質問
-
複数列の最大値を求めたい
-
エクセルでワイルドカード検索...
-
Accessでの全データから空白削除
-
列の数字を足し合わせたい
-
EXCEL 集計の方法
-
SQL文の関数らしいのですが、意...
おすすめ情報
次のようにためしてみたが、「列名があいまい」というエラーで実行できませんでした。
おわかりの方がいらっしゃればご教授をお願いします。
①
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様に感謝します。