根据另一个表中的单元格值连接表

时间:2013-04-30 18:57:07

标签: sql sqlite

我有一个包含几个表的数据库,我试图从中获取一些数据。 但由于布局(我无法做任何事情),我似乎无法正常加入。

我有三张桌子:

  • datorer
  • 程序
  • volymlicenser

  • 在表格" datorer"是一些计算机(使用AD名称,房间号和评论单元注册)。

  • 在表"程序"是我的组织购买的不同程序。

  • 在表格" volymlicenser"是该组织拥有的批量许可证的少数许可证。

此处的单元格是ID,RegKey和comp_name。

大多数程序都是OEM许可证,只安装在一台计算机上,因此他们永远不需要将程序名称与所属计算机一起注册到另一个表中,就像批量许可证一样。

设计数据库时,它只包含最后两个表,并且不需要连接查询。最近他们添加了表" datorer"它由上述细胞组成。

我现在要做的是,最好通过一个查询,查看布尔单元格program.VL是否设置为true。

如果是这样,我想在volymlicenser.RegKey上加入progran.RegKey,然后从那里获取volymlicenser.comp_name中的内容。

我试过的查询是以下..但是没有用。

SELECT 
    prog.Namn AS Program, prog.comp_name AS Datornamn, 
    pc.room AS Rum, pc.kommentar AS Kommentar
FROM 
    program AS prog
JOIN 
    datorer AS pc ON prog.comp_name = pc.comp_name
JOIN 
    volymlicenser AS vl ON vl.RegKey = prog.RegKey
WHERE 
    prog.Namn = "Adobe Production Premium CS6"

希望有人可以帮助我。 :)

请问是否有些事情不完全清楚!

以下是示例记录和所需结果:

datorer

| id | comp_name | room | kommentar|
|----------------------------------|
| 1  | MB-56C5   | 1.1  | NULL     |
| 2  | MB-569B   | 4.1  | NULL     |

program

| id | Namn | amount | VL | RegKey | comp_name | leveranotor | purchased | note | Suite | SuiteContents |
|-----------------------------------------------------------------------------------------------|
| 1 | Adobe Production Premium CS6 | 2 | 1 | THE-ADOBE-SERIAL | NULL | Atea | 2012-11-01 | Purchased 2012 together with new computers | 1 | The contents of this suite |

| 2 | Windows 7 PRO retail | 1 | 0 | THE-MS-SERIAL | MB-569B | Atea | 2012-11-01 | Purchased 2012 together with new computers | 0 | NULL |

| 3 | Windows 7 PRO retail | 1 | 0 | THE-MS-SERIAL | MB-56C5 | Atea | 2012-11-01 | Purchased 2012 together with new computers | 0 | NULL |

volymlicenser

| id | RegKey           | comp_name |
|-----------------------------------|
|  1 | THE-ADOBE-SERIAL | MB-569B   |

根据SQL select查询得到的结果:

| Program | Computer name | Room | Kommentar|
|-------------------------------------------|
| Adobe Production Premium CS6 | MB-569B | 4.1 | NULL |
|-------------------------------------------|

查询Windows 7 PRO零售时所需的结果:

| Program | Computer name | Room | Kommentar|
|-------------------------------------------|
| Windows 7 PRO Retail | MB-569B | 4.1 | NULL |
| Windows 7 PRO Retail | MB-56C5 | 1.1 | NULL |

如果" WHERE"更改为" Windows 7 PRO零售"

简单地说,如果program.VL为1,则comp_name将在volymlicenser.comp_name列中找到。

如果program.VL为0,则comp_name将在program.comp_name列中找到。

Uppon找到comp_name,它需要从datorer.comp_name上的任何一个表中加入comp_name来获取房间号。

我希望这对你来说和对我一样有意义。

3 个答案:

答案 0 :(得分:1)

PROGRAM 中查看COMP_NAME - Adob​​e产品为NULL。在下面,您编写的第一个常规联接将Adobe从结果中删除。因此,在第一次加入之后,您最终得到了Microsoft产品。然后使用Reg_Key进行的第二次连接会让你获得一个空表,因为其余的RegKeys仅指“THE-MS-SERIAL”。

相反......

SELECT prog.namn, coalesce(vl.comp_name, prog.comp_name), pc.room, pc.kommentar
FROM program as prog LEFT JOIN volymlicenser as vl
ON prog.RegKey = vl.RegKey
LEFT JOIN dataorer as pc
ON coalesce(vl.comp_name, prog.comp_name) = pc.comp_name

使用左连接将保留连接语法左侧的表内容。此连接方法是必需的,因为连接键不是通过所有三个表一致地填充。并置函数就像一个ifelse函数。如果第一个变量为null,则将其替换为下一个变量的内容。漂亮的。

顺便说一句,我自己也没有这样做过。

答案 1 :(得分:0)

您可能最好创建2个内联表,每个JOIN配置一个,然后使用CASE来决定选择哪个:

SELECT 
    CASE WHEN table1.column1 = "A"
        THEN table2.column2
    ELSE
        table1.column2
    END
FROM
(SELECT t1.id, t1.column1, t2.column2 
FROM t1 INNER JOIN t2 ON t1.x = t2.y) table1 INNER JOIN
(SELECT t1.id, t1.column1, t3.column2 
FROM t1 INNER JOIN t3 ON t1.x = t2.y) table2 ON table1.id = table2.id;

答案 2 :(得分:0)

我正在尝试以下方法:

SELECT 
    CASE WHEN program.VL = "1"
        THEN Volymlicenser.comp_name AS Datornamn
    ELSE
        program.comp_name AS Datornamn
    END
FROM
    (SELECT prog.Namn AS Program, pc.room AS Room, pc.kommentar AS Komentar
    FROM program AS prog INNER JOIN Volymlicenser AS vlic ON vlic.RegKey = prog.RegKey) table1 INNER JOIN
    (SELECT t1.id, t1.column1, t3.column2 
    FROM t1 INNER JOIN t3 ON t1.x = t2.y) table2 ON table1.id = table2.id;

但是在选择的时候停下来...... 我认真地不理解table1,table2,t1,t2和t3。

loltempast:你(或任何人)可以请小心,因为我似乎不明白应该如何进行查询。