【问题标题】:Select rows WHERE any row in column is equal to 1 or if not, column is equal to 2, but not both选择行 WHERE 列中的任何行等于 1,否则,列等于 2,但不是两者
【发布时间】:2015-08-29 17:38:59
【问题描述】:

我的文本有一个翻译表,例如:

表格:待办事项

day | text_id
-------------
 0  | 1
 1  | 2
 1  | 1

表格:翻译

lang | text_id | text
---------------------
 deu | 1       | Laufen
 eng | 1       | Running
 eng | 2       | Swimming

现在我想用德语 (deu) 查找我的待办事项。我的问题是,我没有 text_id 2: Swimming in German 的翻译(例如)。

我的默认查询是:

SELECT todos.day, translations.text
  INNER Join translations
  ON todos.text_id = translations.text_id
  WHERE translations.locale = 'deu';

我会得到:

day | text
--------------
 0  | Laufen
 1  | Laufen

但我想要:

day | text
--------------
 0  | Laufen
 1  | Swimming
 1  | Laufen

我怎样才能得到一些缺失的行?首先我应该得到所有需要的行:

SELECT todos.day, translations.text
  INNER Join translations
  ON todos.text_id = translations.text_id
  WHERE translations.locale = 'deu' or translations.locale = 'eng';

然后删除所有重复的“eng”,但是 - 如何?

对不起这个糟糕的标题,我不知道如何正确描述它......

【问题讨论】:

    标签: sql sqlite inner-join


    【解决方案1】:

    您需要left join 来保存第一个表中的所有记录。那么你需要它两次来获取默认的英文记录:

    SELECT td.day, coalesce(tdeu.text, teng.text) as text
    FROM todos td left join
         translations tdeu
         ON td.text_id = tdeu.text_id and tdeu.locale = 'deu' left join
         translations teng
         ON td.text_id = teng.text_id and teng.locale = 'eng';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 2016-07-12
      相关资源
      最近更新 更多