2017-02-09 44 views
3

我有这样SQLite的:如何结合子查询结果

id | inventory_id | serial_type | serial 
------------------------------------------------------ 
    38 |  5892  |  1  | 9502 
    39 |  5895  |  1  | i95054-1 
    40 |  5895  |  2  | m95054-1 
    41 |  5895  |  1  | i95054-2 
    42 |  5895  |  2  | m95054-2 
    43 |  5895  |  1  | i95054-3 
    44 |  5895  |  2  | m95054-3 
    45 |  5895  |  1  | i95054-4 
    46 |  5895  |  2  | m95054-4 

表我有相同的表2级的子查询像

SELECT inventory_id, serial as type_one_serial 
FROM serials 
WHERE serial_type = 1 
AND inventory_id = 5895 

和另一

SELECT inventory_id, serial as type_two_serial 
FROM serials 
WHERE serial_type = 2 
AND inventory_id = 5895 

我怎样才能结合这些得到如下结果:

inventory_id | type_one_serial | type_two_serial 
------------------------------------------------ 
5895   | i95054-1  | m95054-1 
5895   | i95054-2  | m95054-2 
5895   | i95054-3  | m95054-3 
5895   | i95054-4  | m95054-4 

编辑: 我已经修改了源表iclude另一列sl

sl | id | inventory_id | serial_type | serial 
---------------------------------------------------------------- 
    0 | 38 |  5892  |  1  | 9502 
    0 | 39 |  5895  |  1  | i95054-1 
    0 | 40 |  5895  |  2  | m95054-1 
    1 | 41 |  5895  |  1  | i95054-2 
    1 | 42 |  5895  |  2  | m95054-2 
    2 | 43 |  5895  |  1  | i95054-3 
    2 | 44 |  5895  |  2  | m95054-3 
    3 | 45 |  5895  |  1  | i95054-4 
    3 | 46 |  5895  |  2  | m95054-4 
+0

你应该向我们展示了'serial'列的通用格式,假设你想成为能够处理任何'inventory_id'。 –

+0

@TimBiegeleisen:'serial'列是用户定义的,并且是字母数字 –

+0

我的意思是一般formst如果知道。无论如何,我在下面给你一个查询,至少对你给我们的样本数据应该起作用。 –

回答

3

你正在寻找一个支点查询:

SELECT inventory_id, 
     MAX(CASE WHEN serial_type = 1 THEN 'i' || SUBSTR(serial, 2) END) AS type_one_serial, 
     MAX(CASE WHEN serial_type = 2 THEN 'm' || SUBSTR(serial, 2) END) AS type_two_serial 
FROM serials 
WHERE serial_type IN (1, 2) AND  -- the WHERE clause may be optional 
     inventory_id = 5895   -- depending on what you want 
GROUP BY inventory_id, 
     SUBSTR(serial, 2) 

更新:

考虑到新的sl列,我们可以使用此来区分给定inventory_id的两种连续出版物类型。在这种情况下,我们可以写下面的查询:

SELECT inventory_id, 
     MAX(CASE WHEN serial_type = 1 THEN serial END) AS type_one_serial, 
     MAX(CASE WHEN serial_type = 2 THEN serial END) AS type_two_serial 
FROM serials 
GROUP BY inventory_id, 
     sl 
+0

感谢蒂姆你的时间!但我认为,这不是我正在寻找的确切代码。由于'serial'列是用户定义的,我不能做'SUBSTR'。 –

+0

如果你想旋转,我们需要知道'serial'列的结构。当然你有某种要求? –

+0

'serial'取自用户输入的文本字段,用户可以输入任意长度为50的字母数字字符集。上述数据只是一些测试数据,实际上它会是任意随机字符。希望我已经回答了你的问题。 –

0

@Tim Biegeleisen的编辑答案对我来说非常合适。基于此我做了一些修改。不知道它会做任何改进,只是在这里张贴供参考:

SELECT inventory_id, MAX(CASE WHEN serial_type = 1 THEN serial END) AS type_one_serial, MAX(CASE WHEN serial_type = 2 THEN serial END) AS type_two_serial FROM serials WHERE inventory_id = 5895 GROUP BY sl

+0

如果您只想查看一个'inventory_id',这是可以接受的。我的回答将涵盖整个表格。 –

+0

单编辑:现在不能选择'inventory_id',因为它没有出现在GROUP BY子句中。所以我选择它作为一个常量文本。 –

+0

谢谢@TimBiegeleisen!我的实际代码有点不同(再次编辑):) –