我在两个表中有一个1:n的关系。还有一些Lang Id的默认值。
+========================+
| Table A |
+==========+======+======+
| Lang ID. | FKB. | Text |
+----------+------+------+
| 1 | 2. | Q |
| 1 | 3. | W |
| 2 | 3. | E |
| 2 | 4. | R |
+==========+======+======+
+=========+
| Table B |
+=========+
| IDB. |
+---------+
| 2 |
| 3 |
| 4 |
+=========+
我想编写SQL来获取Text,对于ID为1的语言的B中的所有元素。如果某个元素没有语言1,则应该采用另一种语言。
以下选择不正确
Select * from B join A on IDB = FKB and langid = 1
预期结果:
Q
W
R
答案 0 :(得分:1)
使用以下查询尝试:
SELECT b.idb, COALESCE(a.text, a2.text) text
FROM b
LEFT JOIN a ON b.idb = a.fkb AND a.langid = 1
LEFT JOIN (
SELECT fkb, text
FROM (
SELECT fkb, text,
ROW_NUMBER() OVER (PARTITION BY kfb ORDER BY langid) seq_no
FROM a
) t
WHERE seq_no = 1
) a2 ON b.idb = a2.fkb
查询将两者连接到表A(限制为langid = 1)和内部视图,它基本上过滤了表A中每个FKB的第一个文本。
COALESCE然后结合来自A和内部视图的文本,更喜欢A的结果而不是内部视图中的结果,这是后备。
答案 1 :(得分:0)
Select * from B join (
(SELECT A.[fkb],A.[text]
FROM A
INNER JOIN
(SELECT min([langid]) as lang,fkb
FROM A
GROUP BY [fkb]) help
ON A.[fkb] = help.[fkb]
AND A.[langid]=help.lang)) helpA
on b.IDB = helpA.FKB