簡體   English   中英

SQL查詢-使用附加動態列聯接多個表

[英]SQL-Query - Join multiple tables with additional dynamic column

我需要有關構建SQL語句的幫助。 數據庫架構如下所示:

SQL模式

我確實准備了下面的SQL-Fiddle ,其中包含示例數據: http : //sqlfiddle.com/#!9/831bab/1

至於SQL小提琴中的樣本數據,我想查詢計算機名稱“ Client02”,並希望得到以下結果:

想要的結果1

PrinterName   | PrintServer | PrinterActive | ComputerActive | isDefaultPrinter
PRT01_Zentral | DC01        | True          | True           | False
PRT02_BH      | DC01        | True          | True           | True

至於SQL小提琴中的樣本數據,我想查詢計算機名稱“ Client01”,並希望得到以下結果:

想要的結果2

PrinterName   | PrintServer | PrinterActive | ComputerActive | isDefaultPrinter
PRT01_Zentral | DC01        | True          | True           | True

如您所見,我需要連接所有表並添加類似於幫助程序列的內容,其中包含有關默認打印機的信息。 (真假)

我開始建立查詢,但是我不知道如何進行...

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" 

我認為我的請求包含所有必要的信息。 SQL-Fiddle具有樣本數據,可以輕松地重現它。 WantedResults應該清楚地顯示目標。

編輯:
DBMS:MySQL

我所做的就是在查詢中添加一條if語句,將內部結果(只能為1)與外部選擇項進行比較。 有一種更好的方法可以實現此目的,但是此答案反映了您所詢問的查詢結果。

編輯:我假設每台計算機僅默認打印機。 您確定所需結果2是否正確? 因為在數據庫中,記錄說計算機1具有1默認的printerid(1),計算機2具有2打印機(1和2),而計算機2是默認打印機。

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"

您可以使用以下查詢來獲取所需的結果

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

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM