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