首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL-Query -用附加的动态列连接多个表

SQL-Query -用附加的动态列连接多个表
EN

Stack Overflow用户
提问于 2018-02-09 09:04:44
回答 2查看 73关注 0票数 0

我需要帮助来构建SQL语句。Database-Schema看起来如下所示:

我确实准备了以下SQL-Fiddle,其中包含示例数据:http://sqlfiddle.com/#!9/831bab/1

对于sample中的示例数据,我希望查询计算机名"Client02“,并希望得到以下结果:

想要结果1

代码语言:javascript
复制
PrinterName   | PrintServer | PrinterActive | ComputerActive | isDefaultPrinter
PRT01_Zentral | DC01        | True          | True           | False
PRT02_BH      | DC01        | True          | True           | True

对于sample中的示例数据,我希望查询计算机名"Client01“,并希望得到以下结果:

想要结果2

代码语言:javascript
复制
PrinterName   | PrintServer | PrinterActive | ComputerActive | isDefaultPrinter
PRT01_Zentral | DC01        | True          | True           | True

正如您所看到的,我需要连接所有的表,并添加类似于助手列的内容,该列包含有关默认打印机的信息。(真/假)

我开始建立查询,但我不知道该如何进行.

代码语言:javascript
复制
SELECT printers.PrinterName, printers.PrintServer, printers.PrinterActive
FROM computermapping
LEFT JOIN computers ON computermapping.ComputerID = computers.ComputerID
LEFT JOIN printers ON computermapping.PrinterID = printers.PrinterID
LEFT JOIN computerdefaultprinter ON computers.ComputerID = computerdefaultprinter.ComputerID
WHERE computers.ComputerName = "Client02" 

我想我的请求包含了所有需要的信息。sample有示例数据,可以轻松地复制它。WantedResults应该清楚地显示目标。

编辑:

DBMS: MySQL

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-09 10:32:35

您可以使用以下查询来获得所需的结果

代码语言:javascript
复制
SELECT printers.PrinterName, 
       printers.PrintServer, 
       printers.PrinterActive, 
       computers.ComputerActive, 
       CASE 
         WHEN computerdefaultprinter.PrinterID IS NULL THEN "false" 
         ELSE "true" 
       END AS isDefaultPrinter 
FROM   computermapping 
       LEFT JOIN computers 
              ON computermapping.ComputerID = computers.ComputerID 
       LEFT JOIN printers 
              ON computermapping.PrinterID = printers.PrinterID 
       LEFT JOIN computerdefaultprinter 
              ON computers.ComputerID = computerdefaultprinter.ComputerID 
                 AND printers.PrinterID = computerdefaultprinter.PrinterID 
WHERE  computers.ComputerName = "Client02" 

我只添加了CASE...WHEN语句和修改了原始查询的联接条件。但我认为,与其使用表computerdefaultprinter,不如将列IsDefaultPrinter添加到表computermapping中。

代码语言:javascript
复制
CREATE TABLE `computermapping` (
  `ComputerMappingID` int(11) NOT NULL,
  `PrinterID` int(11) NOT NULL,
  `ComputerID` int(11) NOT NULL,
  `IsDefaultPrinter` int(1) NOT NULL DEFAULT 0,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
票数 0
EN

Stack Overflow用户

发布于 2018-02-09 09:19:03

我所做的是在查询中添加一个if语句,将内部结果(只能是1)与外部选择进行比较。也许有更好的方法来实现这一点,但这个答案反映了您所要求的查询结果。

编辑:我假设每台计算机只有一台默认打印机。你确定通缉结果2是正确的吗?因为在数据库中,记录显示computer1有1 printerid (1),这是默认的,而computer2有2打印机(1和2),2是默认的。

代码语言:javascript
复制
SELECT printers.PrinterName,
       printers.PrintServer,
       printers.PrinterActive,
       IF (
             (SELECT computerdefaultprinter.printerid
              FROM computerdefaultprinter
              WHERE computerdefaultprinter.computerid = computermapping.computerid) = computermapping.printerid,
           'true',
           'false') AS isDefaultPrinter
FROM computermapping
LEFT JOIN computers ON computermapping.ComputerID = computers.ComputerID
LEFT JOIN printers ON computermapping.PrinterID = printers.PrinterID
LEFT JOIN computerdefaultprinter ON computers.ComputerID = computerdefaultprinter.ComputerID
WHERE computers.ComputerName = "Client02"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48702180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档