我有两个配置表。结构如下:
Table 1: Client_Config
id, name, value, type, description
Table 2: App_Config
name, value, type, description
我想从name
表 value
获取Client_config
和where id = @id
。
对于name
中没有条目(与名称匹配)的行,我还想从values
获取App_config
和client_config
。两个表中的相同名称的值可以不同。
例如: Client_Config中的值
1, testName, testValue, testType, testDescription
1, testName1, testValue1, testType1, testDescription1
1, testName2, testValue2, testType2, testDescription2
App_Config中的值
testName, testValue1, testType, testDescription
testName1, testValue1, testType1, testDescription1
testName2, testValue2, testType2, testDescription2
testName3, testValue3, testType3, testDescription3
在结果集中,我需要以下行:
1, testName, testValue, testType, testDescription
1, testName1, testValue1, testType1, testDescription1
1, testName2, testValue2, testType2, testDescription2
NULL, testName3, testValue3, testType3, testDescription3
答案 0 :(得分:3)
您可以尝试下面的查询
select
c.id, a.name, a.value, a.type, a.description
from App_Config a
left join
(
select * from Client_Config where id=@id
)c
on c.name=a.name
说明:我们需要app_config
中的所有行和client_config
中的相应ID。因此,我们从A到C执行**LEFT JOIN**
。然而,C结果集必须包含来自特定@id
的行,因此我们潜入C集中的WHERE
子句
Sql小提琴演示链接:http://sqlfiddle.com/#!6/44659/4
答案 1 :(得分:2)
您可以使用左连接执行此操作:
SELECT t.id, s.name, s.value, s.type, s.description
FROM App_Config s
LEFT JOIN Client_Config t
ON(t.name = s.name and t.id = @id)
答案 2 :(得分:1)
您可以使用UNION ALL
操作执行此操作:
DECLARE @id INT = 1
SELECT id, name, value, type, description
FROM Client_Config
WHERE id = @id
UNION ALL
SELECT NULL, name, value, type, description
FROM App_Config AS ac
WHERE NOT EXISTS (SELECT 1
FROM Client_Config AS cc
WHERE cc.name = ac.name AND cc.id = @id)
答案 3 :(得分:1)
使用左连接,您可以获得左表中的所有行以及右表中的所有相应行。如果没有匹配的信息,则右表的列将为NULL。 看看这个有用的图表: SQL Join Diagrams
特别是,您的查询可以是这样的:
SELECT c.id, a.name, a.value, a.type, a.description
FROM App_Config a
LEFT JOIN Client_Config c
ON c.name = a.name
WHERE c.id = @id