2017-05-24 14 views
0

私はそれが参照しているテーブルはレコードの1つに設定されている別のテーブルを参照することができ、テーブルを作成しようとしています:MariaDB、フィールド名をテーブル名として使用する方法は?

ルールテーブルには「tblR​​ules」:

biRuleID, BIGINT, Unsigned, Primary Key 
    biTableID, BIGINT, Unsigned, Link to record in 'other' table 
    vcDescription, VARCHAR[64], Description of rule 
    vcTableName, VARCHAR[64], The name of the table containing the rule details. 

テストテーブル'tblTest':

1, 1, Testing rule, tblTest 
01:テストするに

biTestID, BIGINT, Unsigned, Primary Key 
    vcTest, VARCHAR[64], A test string 

、tblRulesは、単一のレコードが含まれています

そしてtblTestは含まれています。私はそれがの名前としてt1.vcTableNameを取っているようだクエリを実行しようとすると、しかし

SELECT 
     * 
    FROM 
     tblRules t1 
    LEFT JOIN 
     t1.vcTableName t2 
    ON 
     t1.biTableID=t2.biTestID 
    WHERE 
     t1.biRuleID=1; 

1, Hello World 

は、今、私がデータをプルしたいですテーブルにはvcTableNameの内容が含まれていませんが、これを整理する方法はありますか?

+0

あまり効果的ではないとして、あなたのDB設計となめらかを行う必要があると思いますけれども、私は、一般的にこの事MariaDBユーザないんだけど、それを達成するために、動的SQLを使用することができますクエリ自体の列からの値)はSQLでは不可能です(実際にはSQL標準に反しているかもしれません)。 SQLの上に言語を置くか、EXECUTE IMMEDIATEを使用してSQL文を動的に生成して実行することで、何らかの形でメタを取得する必要があります。 – Turophile

+0

この種の問題は、悪い設計の兆候です – Strawberry

+0

完全な柔軟性とスケーラビリティを目指しています – SPlatten

答えて

0

あなたは使用して(私は

set @qry = (
    SELECT 
     concat('SELECT * FROM tblRules t1 LEFT JOIN ', t1.vcTableName, ' t2 ON t1.biTableID = t2.biTestID WHERE t1.biRuleID=1') 
    FROM 
     tblRules t1 
    WHERE 
     t1.biRuleID=1 
); 
PREPARE qry FROM @qry; 
EXECUTE qry; 
DEALLOCATE PREPARE qry; 
+0

ありがとう、私は今夜これを試してポストバックします。 – SPlatten

関連する問題