我有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
列中的值放在单独的列中。
答案 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:
答案 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