加入两个表并获取值

时间:2016-03-16 07:49:09

标签: sql sql-server-2008 join

我有两个配置表。结构如下:

Table 1: Client_Config
id, name, value, type, description

Table 2: App_Config
name, value, type, description

我想从name value 获取Client_configwhere id = @id

对于name中没有条目(与名称匹配)的行,我还想从values获取App_configclient_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

4 个答案:

答案 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)

Demo here

答案 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