2

3つの異なるテーブルの1つに存在する1つの一意のID値をクエリしようとしています。

3つのテーブルには、主キーIDの階層化されたセットがあります。

t1 = 1-9 
t2 = 10-19 
t3 = 20-29 

これらのテーブルはoptgroupメニューの一部であり、PKが選択値として使用されます。これは複数選択であるため、ユーザーは最大3つの値を選択できます。これらはすべて、これらのテーブルの1つから、またはそれぞれから1つ取得できます。

value1各選択は、ターゲットテーブルなどvalue2の個別の列に格納されます。value31つの値のみが渡される場合、他の列はNULLです。

私の問題—生データのCSVファイルが一時テーブルにダンプされています。一時テーブルの各行には、これらの値を表す3つの既存の列がありますが、これらは現在、3つのテーブルにもある文字列値であり、ではありませんid。このデータは、アプリで動作する適切なFKを使用して別のテーブル設定に挿入する必要があります。

id既存の3つのテーブルをクエリして、3つのテーブルのいずれかに一致する特定の文字列の値を探し、同じクエリで、一時テーブルの残りの「値」列に対してさらに2回クエリを実行するにはどうすればよいですか。行?

編集

明確化のためのその他のサンプルデータ:

一時テーブルからのデータ:

temp
+---------+---------+---------+--------+
|  value1 |  value2 |  value3 |   user |
+---------+---------+---------+--------+
| primary |   light |     red |   greg | 
|     red |    blue |    NULL |  sarah |
| neutral |  orange |   green |    tim |
|    dark |    blue |   green |  laura |
+---------+---------+---------+--------+

別のテーブルに挿入する必要があります。列のIDは、次のvalueX3つのテーブルにまたがって存在します。

table 1
+---------+---------+
|      id |    name | 
+---------+---------+
|     003 | neutral |
|     004 |    dark |
|     005 |   light |
+---------+---------+


table 2
+---------+---------+
|      id |    name | 
+---------+---------+
|     010 |    blue | 
|     011 |  orange | 
|     012 |     red |
|     013 |   green |
+---------+---------+


table 3
+---------+---------------+
|      id |          name | 
+---------+---------------+
|     020 |       primary |
|     021 | complimentary |
|     022 |     secondary |
+---------+---------------+

一時テーブルの他の列(userこの例では)は挿入の一部であり、次のようにターゲットテーブルにデータを入力します。

   target
    +---------+---------+---------+-------+
    |  value1 |  value2 |  value3 |  user |
    +---------+---------+---------+-------+
    |     020 |     005 |     012 |  greg |
    |     012 |     010 |    NULL | sarah |
    |     003 |     011 |     013 |   tim |
    |     004 |     010 |     013 | laura |
    +---------+---------+---------+-------+

私の最も近い試みは値の最初の列を取得することですが、同じクエリで他の2つを取得する方法に迷っています。

INSERT INTO target (user, value1, value2, value3)
SELECT t.user, a.id, X, X
FROM  temp t,  
      (SELECT * FROM table1
       UNION
       SELECT * FROM table2
       UNION    
       SELECT * FROM table3) as a
WHERE a.name = t.value1
AND X = t.value2
AND X = t.value3

Xを解こうとしています。私はここで自分の要素からかなり外れていますが、これは私が達成しようとしていることを説明することに近いです。

4

2 に答える 2

0

ビューを作成できる場合は、すべてのテーブルの和集合を作成し、その1つを検索してテーブルを作成できます。何かのようなもの:

CREATE VIEW all AS
  select * from table1 union
  select * from table2 union
  select * from table3;

SELECT
  (select id from all where name = value1) as value1,
  (select id from all where name = value2) as value2,
  (select id from all where name = value3) as value3,
  user
FROM temp;
于 2012-09-19T07:09:40.590 に答える
0

このようなものはどうですか:

SELECT a.id, a.t_name
FROM
    (SELECT id, t1_name AS t_name FROM t1
    UNION ALL
    SELECT id, t2_name AS t_name FROM t2
    UNION ALL
    SELECT id, t2_name AS t_name FROM t3) a
WHERE a.id IN ('value1', 'value2', 'value3')

アップデート1

いくつかのサンプルデータを取得した後、これがあなたが行きたい方向だと思います:

SELECT a.v1, a.v2, a.v3
FROM
    (SELECT id AS v1, NULL AS v2, NULL AS v3 FROM t1
    UNION ALL
    SELECT NULL AS v1, id AS v2, NULL AS v3 FROM t2
    UNION ALL
    SELECT NULL AS v1, NULL AS v2, id AS v3 FROM t3) a
WHERE a.v1 = someId OR a.v2 = someId OR a.v3 = someId
于 2012-09-18T20:03:22.910 に答える