簡體   English   中英

使用WHERE選擇LEFT / RIGHT JOIN並返回NULL

[英]select LEFT/RIGHT JOIN using WHERE and return NULL's

我需要將以下兩個工作查詢轉換為單個查詢,但我嘗試的所有內容因各種原因而死於我。 我的最終結果是嘗試列出所有手頭的軟件,並顯示已安裝的軟件以及未針對要查詢的特定PC安裝的軟件。 對於已安裝的軟件,請列出名稱,否則顯示名稱為NULL。 我在where子句中嘗試了一些子選擇語句,它給了我一個沒有錯誤的結果,但沒有給出正確的結果。 任何幫助表示贊賞。

qry1

SELECT device_software.sw_id

FROM Software_device LEFT JOIN Device ON Software_device.d_id = Device.d_id

WHERE Device.d_id = 1;

qry2

SELECT Software.name, Software.sw_id, qry1.sw_id

FROM software LEFT JOIN qry1 ON software.sw_id = qry1.sw_id;

設備表

------------------
| name  | d_id  |
------------------
| PC1   | 1     |
| PC2   | 2     |
| PC3   | 3     |
------------------

軟件表

------------------
| name  | sw_id |
------------------
| SW_a  | A     |
| SW_b  | B     |
| SW_c  | C     |
| SW_d  | D     |
------------------

Software_Device表(多對多)

------------------
| d_id  | sw_id |
------------------
| 1     | A     |
| 1     | B     |
| 2     | A     |
| 2     | B     |
| 2     | C     |
------------------

結果我正在尋找...(在PC1上安裝和卸載的軟件)

---------------------------------
| Sotfware  | pc_id |   name    |
---------------------------------
| SW_a      | 1     |   PC1     |
| SW_b      | 1     |   PC1     |
| SW_c      | NULL  |   NULL    |
| SW_d      | NULL  |   NULL    |
---------------------------------

我列出了mysql和sql標簽,因為我覺得它不重要,但是萬一它確實如此,我正在使用mysql。

SELECT 
   s.name AS software, 
   IF((SELECT COUNT(sw.d_id) FROM software_device sw WHERE sw.sw_id = s.sw_id AND d_id = 1) > 0, 1, NULL) AS pc_id, 
    (SELECT d.name FROM device d INNER JOIN software_device sw ON d.d_id = sw.d_id WHERE sw.sw_id = s.sw_id AND d.d_id = 1)  AS name
FROM 
   software s
ORDER BY s.name

編輯2:也許不是最有效/美麗,但它的工作原理

根據您的要求,這將為您提供正確的結果:

select software.name as Software,
    device.d_id as pc_id,
    device.name as name
from software
    left join device_software
        on device_software.sw_id = software.sw_id
    left join device
        on device_software.d_id = device.d_id
            and device.d_id = 1

只是注意:我更喜歡將主鍵作為表中的第一列。 我還建議用復數(設備)命名你的表

如果RomanKonz的答案肯定很接近,只需將“where”移動到“on”,讓左邊的連接正常工作。

select software.name as Software,
    device.d_id as pc_id,
    device.name as name
from software
    left join device_software
        on device_software.sw_id = software.sw_id
       and **device_software**.d_id = 1
    left join device
        on device_software.d_id = device.d_id
;

以下應該做你需要的:

select s.`name` as `Software`, d.`d_id`, d.`name` as `Device` 
from software s
      left outer join software_device sd 
          on sd.`sw_id` = s.`sw_id` and sd.`d_id` = 1     
      left outer join device d using (`d_id`)  
order by s.`name`

暫無
暫無

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

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