以下の内容の追加質問です。
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も見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
列名に変数を使うことはできないのでしょうか?
SQL Server
-
検索結果の列数を動的に変更したい
SQL Server
-
SQLのクエリ、又はプロシージャで変更前と変更後の値だけ抽出して新しいテーブルに格納したい
SQL Server
-
-
4
列番号による項目の取得について
SQL Server
-
5
GROUP BYを行った後に結合したい。
Oracle
-
6
フィールド名を変数で指定するには
MySQL
-
7
【PL/SQL】FROM区に変数を使う方法
Oracle
-
8
select文の実行結果に空白行を入れたい
MySQL
-
9
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
10
PLSQLのバインド変数の件です。
Oracle
-
11
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
12
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
13
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
14
MS SQLServer のSQLで文字列の前にN:
その他(データベース)
-
15
型 varchar から型 numeric への変換エラー。
その他(データベース)
-
16
Statement ignored というエラー
Oracle
-
17
Accessでフィールド名を変数(文字列)で・・・
Access(アクセス)
-
18
クロス集計で、列を動的に
SQL Server
-
19
ユーザー定義関数内でのsp_executesqlプロシージャの使用
SQL Server
-
20
ビューで引数を使いたい
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
外部参照してるキーを主キーに...
-
伝票番号、品番、在庫としてマ...
-
Access:クエリーにて集計後に...
-
項目名に大文字と小文字の混在...
-
”+”の符号をつける方法
-
DB2のSQL
-
複数列の最大値を求めたい
-
特定の文字列で列を区切るには?
-
SELECT 文 GROUP での1件目を...
-
SQLによる"あいうえお"順でソー...
-
SQLで列名を変数にできないでし...
-
bcp out の使い方
-
【VB.NET】日付型の列にNULLを...
-
特定の列だけをGROUP BYしたい時
-
列番号による項目の取得について
-
テーブル列数とデータファイル...
-
差し込み後、元データを変更し...
-
コンピュータ
-
広告ブロッカーのアドカードと...
-
for whichの使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT 文 GROUP での1件目を...
-
外部参照してるキーを主キーに...
-
SQLで列名を変数にできないでし...
-
列のヘッダーを含めるのをデフ...
-
Access:クエリーにて集計後に...
-
列番号による項目の取得について
-
【VB.NET】日付型の列にNULLを...
-
UPDATE文のWHERE条件に他のテー...
-
SQLによる"あいうえお"順でソー...
-
特定の文字列で列を区切るには?
-
テーブル列数とデータファイル...
-
項目名に大文字と小文字の混在...
-
特定の列だけをGROUP BYしたい時
-
Accessでの全データから空白削除
-
複数列の最大値を求めたい
-
DB2のSQL
-
SQLのクエリ、又はプロシージャ...
-
IDENTITY列の更新で失敗する
-
SQLについて質問です。 テーブ...
-
Accessのリストボックスについて
おすすめ情報
次のようにためしてみたが、「列名があいまい」というエラーで実行できませんでした。
おわかりの方がいらっしゃればご教授をお願いします。
①
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様に感謝します。