2013-04-30 67 views
1

我有一个数据库,其中有一些表格正在尝试从中获取一些数据。 但由于布局(我不能做任何事情),我似乎无法得到正常的JOIN工作。根据另一个表格中单元格的值来连接表格

我有三个表:

  • 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 | 
查询为Windows 7 PRO零售时

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

期望的结果:

根据SQL SELECT查询所需的结果

| 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,则可以在volymlicenser.comp_name列中找到comp_name。

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

如果找到comp_name,它需要从datorer.comp_name上的任意这些表中加入comp_name以获取房间号。

我希望这对你来说同样适用于我。

+1

在您的代码第6行中,有'ON v1.comp-name = ...'。这是一个错字吗?你想输入“v1.comp_name”吗?我问这是因为'-'是SQL中的一个运算符。也许这是你出错的地方。 – Rachcha 2013-04-30 19:08:44

+0

是的,这实际上是一个错字。 :) – Rickard 2013-04-30 19:37:21

+0

嗯,我在前段时间看到了一个建议,但是由于之间存在某种东西,所以没有立即尝试。 现在我去了这里试试看,它似乎已经消失了。它被删除或我疯了吗? – Rickard 2013-04-30 22:02:35

回答

1

查看COMP_NAME中的程序 - Adob​​e产品为NULL。接下来,您写的第一个常规联接会将Adobe从结果中删除。所以,在第一次加入之后,你只是结束了微软的产品。然后使用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 

使用左边的联接将表的内容保存到联接语法的左侧。此连接方法是必需的,因为连接密钥并不是通过所有三个表格一致地填写。 coalesce函数就像一个ifelse函数。如果第一个变量为空,那么它将被替换为下一个变量的内容。俏皮。

顺便说一句,我没有自己运行这个。

+0

谢谢你@ ek2758,这是我想要的方式(至少看起来是这样)。 有了一些可以工作的东西,我现在可以尝试找到关于它的原因的信息并阅读它。有些人在奇怪的学习过程中发现这种方法,但这是我实际学习而不是反复试验的最好方式。 – Rickard 2013-05-03 07:42:12

+0

太棒了。如果你想了解机制,我建议分别运行每个连接并从两个表中选择每个连接键。通过这种方式,可以很容易地直观地理解它背后的机制。祝你好运! – ek2758 2013-05-03 19:54:18

0

你可能会更好过创造200个内嵌表,一个与每个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; 
+0

谢谢,虽然我不确定我应该如何使用case和inner连接来实现我的表格布局。 随着案件的一部分,我应该加入哪些表? 我真的没有线索! – Rickard 2013-05-02 10:42:41

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; 

但是在select处停下来.. 我真的不明白table1,table2,t1,t2和t3在这里。

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

相关问题