从SQL中的表中获取默认值或值

时间:2014-04-27 09:33:41

标签: sql oracle join

我在两个表中有一个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

2 个答案:

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