1

私は現在、元素の表にリンクされている濃度の表を持っています。濃度表があります

|conc_id|element_id|conc|

および元素表

|element_id|symbol|

濃度テーブルには、ゼロ以外の濃度を持つ各conc_idのelement_idのみが含まれます。私がやろうとしているのは、concentration_idごとに、ゼロ以外であるかどうかに関係なく、すべての要素をその濃度とともに順番にリストするクエリを作成することです。私はこれをますます複雑な方法(で始まるRIGHT JOIN)で試しましたが、その要素が含まれていない場合、これは常にNULLのconc_idを出力します。私が探している出力は次のようなものです。

|conc_id|element_id|symbol|conc|
|1      |1         |H     |1.2 |
|1      |2         |He    |NULL|
|1      |3         |Li    |2.3 |
              ...
|3      |1         |H     |4.5 |
|3      |2         |He    |NULL|
|3      |3         |Li    |NULL|
              ...

等々。NULL conc_idなしでこれを行う方法はありますか?

事前に助けてくれてありがとう...

4

4 に答える 4

3

まず、との間のすべての組み合わせを含むテーブルを作成する必要がありconc_idますelement_id

SELECT DISTINCT conc_id, elements.element_id FROM concentrations, elements;

これにより、次の表が得られます。

| conc_id | element_id |
|       1 |          1 |
|       1 |          2 |
|       1 |          3 |
            ...
|       3 |          1 |
|       3 |          2 |
|       3 |          3 |
            ...

そのようなテーブルができたら、それを濃度と元素で結合するのはかなり簡単なはずです。例えば:

SELECT combinations.conc_id, combinations.element_id, symbol, conc
FROM 
  (SELECT DISTINCT conc_id, elements.element_id FROM concentrations, elements) AS combinations
  LEFT JOIN concentrations ON (combinations.conc_id = concentrations.conc_id AND combinations.element_id = concentrations.element_id)
  LEFT JOIN elements ON (combinations.element_id = elements.element_id);

結果:

| conc_id | element_id | symbol | conc |
|       1 |          1 | H      |  1.2 |
|       1 |          2 | He     | NULL |
|       1 |          3 | Li     |  2.3 |
                  ...
|       3 |          1 | H      |  4.5 |
|       3 |          2 | He     | NULL |
|       3 |          3 | Li     | NULL |
                  ...
于 2012-07-05T20:19:46.710 に答える
0
select conc_id, conc.element_id, symbol, concentration from concentration_table as conc 
join element_table as elem on conc.element_id = elem.element_id
order by conc.conc_id asc

これは私にこのテーブルを与えます:

conc_id     element_id  concentration   element_id  symbol 
1           1                  1.2           1       H
1           2                  0             2       He
1           3                  2.3           3       Li
3           1                  4.5           1       H
3           2                  0             2       He
3           3                  0             3       Li

そして、これらは開始テーブルです:

element_table:

element_id    symbol 
1               H
2               He
3               Li

濃度表:

conc_id        element_id        concentration 

1                1                1.2
1                2                0
1                3                2.3
3                1                4.5
3                2                0
3                3                0

編集:要求された正しいテーブル値を取得するためにクエリを編集しました

于 2012-07-05T20:07:58.727 に答える
0

正直なところ、conc列に欠落しているデータをゼロ値で実際に入力するのが最善の方法だと思います。それ以外の場合は、実際には持っていないデータを表示するためにハッキングしようとしているので、とにかくnull値を保持するよりもはるかに具体的です...

もちろん、これが妨げになるパフォーマンスの考慮事項がないと仮定します。

于 2012-07-05T19:58:31.200 に答える
0

どこかにすべてのconc_idの単純なリストがないと仮定すると、次のようなことを試すことができます。

SELECT c.conc_id, e.element_id, e.symbol, c2.conc

FROM
(SELECT DISTINCT conc_id FROM concentration c) c
INNER JOIN element e
LEFT JOIN concentration c2 ON c2.conc_id = c.conc_id AND c2.element_id = e.element_id

ORDER BY c.conc_id, e.element_id

ロジックは次のとおりです。

  1. すべての一意のconc_id派生テーブルcのリストを取得します
  2. 要素に対してクロス結合を実行します(cの各行について、要素のすべての行をリストします)
  3. 完全な濃度表に対して左結合。

すべてのconc_idを持つ別のテーブルがある場合は、派生テーブルを完全に回避できます。

于 2012-07-05T20:20:50.467 に答える