Select 有条件地连接表
Select join tables conditionally
我有三张表A,F,R
Table A
-----
id | type | user_id
Table F
-----
id | Title
Table R
-----
id | Title
在 A 中有一列 Type
,它只能包含值 f
或 r
。
现在我想 select 并有条件地连接三个表,如果 A 中的列值 Type
是 r
则连接从 A 到 R 的行,并连接从 A 到 F 的行如果 A 中的 Type
列是 f
我试过了
SELECT a.*,f.* FROM `A` a
INNER JOIN F ON F.type= a.type AND a.type = 'f'
INNER JOIN R ON F.type= a.type AND a.type = 'r'
我得到的是空行
你很接近,但需要更改为 LEFT-JOIN 并使用合并...如果第一个值为 null,它会从另一个获取 table...但是您的示例结构没有它真的不匹配,因为您没有在 "F" 和 "R" table 中显示 "TYPE" 列。
SELECT
a.*,
COALESCE( f.title, r.title ) as WhichTitle
FROM
`A` a
LEFT JOIN F
ON a.type = F.type
LEFT JOIN R
ON a.type = R.type
where
a.type = 'f'
or a.type = 'r'
但是,也就是说,如果您还可以提供一些示例数据来显示每个 table 的上下文以及您的期望,将会有所帮助。
输入 f 和 r 会更容易,否则您可以在连接之前添加它
DECLARE @a TABLE(id INT, type VARCHAR(1), user_id int)
DECLARE @f TABLE(id INT, title VARCHAR(2))
DECLARE @r TABLE(id INT, title VARCHAR(2))
INSERT INTO @a
SELECT 1,'r',1
UNION ALL
SELECT 2,'f',2
INSERT INTO @f
SELECT 1,'f1'
UNION ALL
SELECT 2,'f2'
INSERT INTO @r
SELECT 1,'r1'
UNION ALL
SELECT 2,'r2'
SELECT a.*,b.*
FROM @a a
INNER JOIN (
SELECT *,'r' AS type FROM @r
UNION ALL
SELECT *,'f' AS type FROM @f
) AS B ON B.type = a.type
我有三张表A,F,R
Table A
-----
id | type | user_id
Table F
-----
id | Title
Table R
-----
id | Title
在 A 中有一列 Type
,它只能包含值 f
或 r
。
现在我想 select 并有条件地连接三个表,如果 A 中的列值 Type
是 r
则连接从 A 到 R 的行,并连接从 A 到 F 的行如果 A 中的 Type
列是 f
我试过了
SELECT a.*,f.* FROM `A` a
INNER JOIN F ON F.type= a.type AND a.type = 'f'
INNER JOIN R ON F.type= a.type AND a.type = 'r'
我得到的是空行
你很接近,但需要更改为 LEFT-JOIN 并使用合并...如果第一个值为 null,它会从另一个获取 table...但是您的示例结构没有它真的不匹配,因为您没有在 "F" 和 "R" table 中显示 "TYPE" 列。
SELECT
a.*,
COALESCE( f.title, r.title ) as WhichTitle
FROM
`A` a
LEFT JOIN F
ON a.type = F.type
LEFT JOIN R
ON a.type = R.type
where
a.type = 'f'
or a.type = 'r'
但是,也就是说,如果您还可以提供一些示例数据来显示每个 table 的上下文以及您的期望,将会有所帮助。
输入 f 和 r 会更容易,否则您可以在连接之前添加它
DECLARE @a TABLE(id INT, type VARCHAR(1), user_id int)
DECLARE @f TABLE(id INT, title VARCHAR(2))
DECLARE @r TABLE(id INT, title VARCHAR(2))
INSERT INTO @a
SELECT 1,'r',1
UNION ALL
SELECT 2,'f',2
INSERT INTO @f
SELECT 1,'f1'
UNION ALL
SELECT 2,'f2'
INSERT INTO @r
SELECT 1,'r1'
UNION ALL
SELECT 2,'r2'
SELECT a.*,b.*
FROM @a a
INNER JOIN (
SELECT *,'r' AS type FROM @r
UNION ALL
SELECT *,'f' AS type FROM @f
) AS B ON B.type = a.type