1

我目前有一个浓度表,它链接到一个元素表。有浓度表

|conc_id|element_id|conc|

和和元素表

|element_id|symbol|

浓度表只有每个 conc_id 具有非零浓度的 element_id。我要做的是创建一个查询,该查询将为每个浓度 ID 按顺序列出所有元素及其浓度,无论它们是否非零。我已经以许多越来越复杂的方式(从 a 开始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_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 列中用零值实际填充缺失的数据。否则,您正试图破解它以显示您实际上没有的数据,并且它比保持空值更切实......

当然,假设没有性能考虑会阻碍这一点。

于 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 回答