2011-12-29 13 views
2

これは私の状況です。SQLクエリ - テーブルからのフィールド

TABLE

Name | Phone    
John 123 
Mick 233 

表B

Department | Position   
IT   xxx 
HR   yyy 

そして、次の構成テーブルWeb経由で動的に作成されています:

私は一例で、別のテーブルを持っています表C

Source | Field 
TABLE A Name 
TABLE B Department 

アプリケーションを実行すると、表Cが読み込まれ、データを生成する必要があります。 この場合、表Aのすべての名前と表Bのすべての部署をリストする必要があります。

これをどのように問い合せることができますか?私は誰かが私を助けることを願っています。

乾杯!あなたは表Cの内容を信頼することはできません場合、私はお勧めしません - - あなたは、SQLでこれを行う必要がある場合は

+0

テーブルAからの名前とテーブルBからの部署を一覧表示するように、クエリCでテーブルCを作成しますか?これを正しく理解すれば、テーブルAをテーブルBに関連付けるフィールドが必要になります(従業員IDなど)。既にテーブルCをお持ちの場合は、名前と部門の両方があるため、問題は既に解決されていますか?あなたはテーブルCから読むと、これはすでに作成されているように見えますか? –

+0

ようこそStackOverflow:コード、XML、またはデータサンプルを投稿する場合は、テキストエディタでこれらの行を強調表示し、エディタツールバーの "コードサンプル"ボタン( '{}')をクリックしてください。それを強調する構文! –

+1

どのDBMSを使用していますか。 SQL Server、Oracle、MySQL ...? –

答えて

0

あなたは、そのSQLを実行し、SQLクエリが含まれている変数を構築する必要があります。動的にクエリします。これを行う方法は、あなたのDBMSに完全に依存します。 (表Cは一列のみを持っていることを前提とし)のMySQLの例:

SELECT @sql:=CONCAT("SELECT ",field," FROM ",source) FROM TABLE_C; 
PREPARE s1 FROM @sql; 
EXECUTE s1; 

SQL Serverの構文:

DECLARE @sql nvarchar(max) 
SELECT @sql = "SELECT " + field + " FROM " + source FROM TABLE_C 
EXEC sp_executesql @sql 
GO 

TABLE Cは確かに複数の行を持つことになりますので、あなたが反復処理する必要があります表C.これはCURSORで行うことができ、正確な詳細はDBMSに依存します。

表CがWebから作成されていることを宣言すると、これは非常に危険であることに注意してください。 FIELDとSOURCEフィールドに何があるかは保証されていません。SQLの知識がほとんどない人は、SQLインジェクション攻撃でいっぱいになる可能性があります。安全にパラメータ化されたデータベース・メタ問合せを使用して、TABLE Cの内容が実際の表/列であることを安全に検証する必要がある場合があります。

+0

テーブルCはWeb経由で作成されます。一度作成されると、私はそのテーブルを照会して情報を取得する必要があります。たとえば、テーブルCに「テーブルA |部門」がある場合、テーブルAからすべての部門をリストする必要があります。問題は、テーブルCにクエリを実行してテーブルAにアクセスし、情報を取得する方法です。フィールドなので。私の言っていることが分かるよね? – Fabricio

+0

私はあなたが何を意味しているのか理解していると思います。それが私の答えにあります。このようなクエリを実行する唯一の方法は、dynamic-sql:query table Cを使用して、実際に実行するクエリを含む文字列を作成し、EXECUTE呼び出しでそのクエリを実行することです。すべてではないにしてもほとんどのデータベースサーバでは、これらの種類の要求に対して動的SQLを使用できます。ただし、テーブルCにはSQLインジェクション攻撃が含まれる可能性があるため危険です。動的クエリを作成する前に、テーブルCの内容が実際のテーブル/カラムであることを確認する必要があります。 – philofinfinitejest

+0

私はSQL Serverを使用していますが、できません。動的SQLは私のために新しいものであり、私は混乱しています。 「FIELD」と「SOURCE」を宣言する必要がありますか?どうしたらいいですか? – Fabricio

-1
select ta.Name, tb.Department 
from TABLEA ta, TABLEB tb 
+0

ようこそStackOverflow:コード、XML、またはデータサンプルを投稿する場合、テキストエディタでこれらの行を強調表示し、エディタツールバーの "コードサンプル"ボタン( '{}')をクリックしてください。それを強調する構文! –

+2

また、適切なANSI JOIN構文を使用することをお勧めします。 'SELECT ta.Name、tb.Department FROM dbo.TableA INNER JOIN dbo.TableB tb ON .......'(または、別のJOINを使用する) - カンマで区切られたテーブルを一覧表示するのではなく、危険です。ここでデカルト製品が本当に必要なのか、ちょうどWHEREのJOIN条件を忘れてしまったのかは不明です。 ...ちょうど乱雑 –

関連する問題