'Joining two tables and getting values
I have two config tables. The structure is as below:
Table 1: Client_Config
id, name, value, type, description
Table 2: App_Config
name, value, type, description
I want to get name and value from Client_config table where id = @id.
I also want to get name and values from App_config for rows where there are no entries(matched with name) in client_config. Values for the same name can be different in both the tables.
eg: Values in Client_Config
1, testName, testValue, testType, testDescription
1, testName1, testValue1, testType1, testDescription1
1, testName2, testValue2, testType2, testDescription2
Values in App_Config
testName, testValue1, testType, testDescription
testName1, testValue1, testType1, testDescription1
testName2, testValue2, testType2, testDescription2
testName3, testValue3, testType3, testDescription3
In the result set I need the following rows:
1, testName, testValue, testType, testDescription
1, testName1, testValue1, testType1, testDescription1
1, testName2, testValue2, testType2, testDescription2
NULL, testName3, testValue3, testType3, testDescription3
Solution 1:[1]
You can do it using a left join:
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)
Solution 2:[2]
You can try a query like below
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
Explanation: We need all rows from app_config and corresponding id from client_config. So we do a **LEFT JOIN** from A to C. The C result set however must contain rows from a particular @id only so we sneak in a WHERE clause in the C set
Sql fiddle demo link : http://sqlfiddle.com/#!6/44659/4
Solution 3:[3]
You can do it using a UNION ALL operation:
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)
Solution 4:[4]
With a Left Join you get all the rows from the left table and all the corresponding rows from the right table. If there is no matching information, then the columns of the right table will be NULL. Take a look at this useful diagram: SQL Join Diagrams
In particular, your query can be something like this:
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
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | |
| Solution 3 | Giorgos Betsos |
| Solution 4 |
