[英]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.