T-SQL - 如何将两个表的结果与两个不同的WHERE子句组合在一起

时间:2016-10-25 14:38:49

标签: sql sql-server tsql

我有3个表,VALUES,SETTINGS和CONTROLS。每个SETTING都有一个CONTROL,它们都不一定有值。

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,另一行用于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列中的值放在单独的列中。

6 个答案:

答案 0 :(得分:2)

您只需要在值上使用左连接,您可以使用内连接作为另一个,如下所示:

  

每个SETTING都有一个CONTROL:

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图,取自here

enter image description here

答案 1 :(得分:0)

阅读不同类型的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)

答案 2 :(得分:0)

你应该看一下左连接。这是一个可能适合你的查询:

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

答案 3 :(得分:0)

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;

答案 4 :(得分:0)

以下查询将为您提供 - 对于每个设置,控件名称以及任何值(如果有)。

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。

答案 5 :(得分:0)

终于搞清楚了!

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