0

というテーブルがありますTable1

テーブルには、次のような列が含まれています。

  • (結合のsourceID)ID
  • (sourceTable結合されるテーブル、これは変数です)

私のクエリ:

SELECT T.Category, J.Tariff
FROM Table1 as T
INNER JOIN T.SourceTable J ---- This needs to be changed
ON T.sourceID = J.id

これは可能ですか?

基本的に、ソーステーブルは行ごとに異なる場合があります

4

5 に答える 5

0

次のようなことを試してください:

1)VIEWすべてのソース テーブルで を作成します。

CREATE VIEW source_tables AS
(SELECT 'table_1' as table_name,
        id,
        value
 FROM table_1
 UNION ALL
 SELECT 'table_2' as table_name,
        id,
        value
 FROM table_2
 UNION ALL
 ..........
 SELECT 'table_n' as table_name,
        id,
        value
 FROM table_n);

2) を使用しVIEWて、ソース テーブルから値を取得します。

SELECT T.category, S.value
FROM base_table as T
JOIN source_tables S ON T.sourceID = S.id AND T.SourceTable = S.table_name
于 2012-11-23T10:36:05.907 に答える
0

Union を使用して、テーブル ポインターを使用して列でフィルター処理できます。このようなもの:

SELECT T.Category, J.Tariff
FROM Table1 as T
INNER JOIN T.SourceTable1 J ON T.sourceID = J.id
where T.sourceTable = '1'
union
SELECT T.Category, J.Tariff
FROM Table1 as T
INNER JOIN T.SourceTable2 J ON T.sourceID = J.id
where T.sourceTable = '2'
于 2012-11-23T10:23:53.730 に答える
0

原則として、左結合を使用することは可能ですが、ルックアップ テーブルのセットが固定されている場合に限ります (それ以外の場合は、SQL ステートメントを動的に構築する必要があります)。

SELECT T.Category, coalesce(source1.tariff, source2.tariff) as tariff
FROM Table1 as T
LEFT OUTER JOIN T.source1 
  ON T.sourceID = source1.id and t.sourcetable = 'source1'
LEFT OUTER JOIN T.source2 
  ON T.sourceID = source2.id and t.sourcetable = 'source2'

しかし、他の回答で述べたように、それは通常、データベースの設計に欠陥があることを示しています。

于 2012-11-23T10:27:15.003 に答える
0

それは一般的に悪い考えだと思います。可能であっても、基本的にはオプティマイザーが多くのことを実行できなくなります (これにより、クエリが大幅に遅くなる可能性があります)。

これを機能させようとするのではなく、データベースの設計を変更して、実行しようとしていることが簡単になるようにすることをお勧めします (結合するテーブルが 1 対 1 でマッピングされているベース テーブルを用意することを考えてください)。

于 2012-11-23T10:18:27.973 に答える
0

テーブル名は、SQL クエリで動的にすることはできません。これを行うには、別の方法を見つける必要があります。および/または EXEC()
を使用します。Stored Procedure

于 2012-11-23T10:18:01.467 に答える