簡體   English   中英

T-SQL-如何將兩個表的結果與兩個不同的WHERE子句合並

[英]T-SQL - How to combine results of two tables with two different WHERE clauses

我有3個表,值,設置和控件。 每個SETTING都有一個CONTROL,但不一定都有VALUE。

VALUES          SETTINGS          CONTROLS
------          --------          --------
ID              ID                ID
SettingID       SettingName       SettingID
Value           ProductFamilyID   ControlName
OrderID

我已經嘗試過加入和合並,但無法正常工作。 我想要的是查詢結果如下所示的查詢:

SettingName     ControlName     Value
-----------     -----------     -----
Setting1        Control1        Value1
Setting2        Control58       Value22
Setting3        Control22       null

我忘了提一下,我想在VALUE.OrderID = '1'以及SETTINGS.ProductFamilyID='2'地方過濾結果

我一直面臨的問題是,有52個設置,但只有45個具有值。 因此,在所有左側聯接的情況下,缺少7個SETTING,我只能看到具有VALUE的45個。

使用UNION時,我有一些接近的地方,但結果分別放在單獨的行中(對於CONTROL,則為1行;對於其VALUE或無值,則為另一行)

SELECT 
    SETTINGS.ID, CONTROLS.ControlName 
FROM 
    CONTROLS
INNER JOIN 
    Settings ON CONTROLS.SettingID = SETTINGS.ID
WHERE 
    SETTINGS.ProductFamilyID = '2'

UNION 

SELECT 
    SETTINGS.ID, VALUES.Value 
FROM 
    VALUES
INNER JOIN 
    SETTINGS ON VALUES.SettingID = SETTINGS.ID
WHERE 
    VALUES.OrderID = '1'

結果是:

SettingID     ControlName
---------     -----------
1             Control1
1             Value1
2             Control2
2             Value2
3             Control3 <--- Control3 has no value
4             Control4
4             Value4

我想要的是將值放在ControlName列的單獨列中。

您只需要在Values上進行左連接,就可以對另一個連接使用內部連接,如您所說:

每個設置都有一個控件:

SELECT s.SettingName, s.ControlName, v,Value
FROM Settings s
INNER JOIN Controls c ON c.SettingID = s.ID
LEFT JOIN VALUES v ON v.SettingsID = s.ID

作為參考,這是一個很棒的JOINS圖,從此處獲取

在此處輸入圖片說明

閱讀不同類型的SQL Join及其工作方式。 當您了解left聯接如何工作時,您的要求非常簡單:

select s.SettingName
      ,c.ControlName
      ,v.Value
from Settings s
    left join Controls c
        on(s.ID = c.SettingID)
    left join Values v
        on(s.ID = v.SettingID)

您應該看看左聯接。 這是一個可能適合您的查詢:

SELECT
    SETTINGS.SettingName,
    CONTROLS.ControlName,
    VALUES.Value
FROM
    SETTINGS
    LEFT JOIN CONTROLS
        ON SETTINGS.ID=CONTROLS.SettingID
    LEFT JOIN VALUES
        ON VALUES.SettingID=CONTROLS.SettingID
SELECT
    s.SettingName
    , c.ControlName
    , v.Value
FROM
    SETTINGS s
    INNER JOIN CONTROLS c ON s.ID = c.SettingID
    LEFT OUTER JOIN VALUES v ON s.ID = v.SettingID;

以下查詢將為您提供-每個設置,控件名稱和任何值(如果有)。

select SettingName, ControlName, Value
from SETTINGS S 
inner join CONTROLS C on S.ID = C.SettingID
left join VALUES V on S.ID = V.SettingID

內部聯接的行同時顯示在設置和控件中。

左聯接給出設置中出現的所有行,以及值中的任何對應行,如果沒有,則為null。

終於想通了!

SELECT 
    FIRSTSET.ID, FIRSTSET.SETTINGNAME, FIRSTSET.CONTROLNAME, SECONDSET.VALUE 
FROM
    (SELECT 
        SETTINGS.ID AS ID, SETTINGS.SettingName 
    AS 
        SETTINGNAME,  CONTROLS.ControlName AS CONTROLNAME 
    FROM 
        CONTROLS
    INNER JOIN 
        SETTINGS ON CONTROLS.SettingID = Settings.ID
    WHERE 
        SETTINGS.ProductFamilyID = '2') 
    AS FIRSTSET
LEFT JOIN
    (SELECT 
        SETTINGS.ID 
    AS ID2, VALUES.Value AS VALUE FROM VALUES
    INNER JOIN 
        SETTINGS ON VALUES.SettingID = SETTINGS.ID
    WHERE 
        VALUES.SalesOrderLineID = '1') 
    AS SECONDSET
ON FIRSTSET.ID = SECONDSET.ID2

暫無
暫無

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

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