SELECT JOIN 两张表,一行多行

SELECT JOIN two tables with multible rows in one row

我从瑞士 post 那里得到了一个包含所有地址的 CSV 文件。对于用例,我们只需要大约 10% 的包含数据。我现在尝试合并并删除不需要的数据。 瑞士对某些城市/街道名称使用 3 种不同的语言。主要-table 始终包括来自城市的口语。在第二个 table 中,第二种语言有一行,第三种语言有第二行。

最后我想要这样的输出:

PID | ZIP_CODE | DE_CITY | FR_CITY | IT_CITY

我的查询是这样的:

SELECT
   NEW_PLZ1.ONRP,
   case
       when NEW_PLZ1.SPRACHCODE = '1' then NEW_PLZ1.ORTBEZ18
       when NEW_PLZ2.SPRACHCODE = '1' then NEW_PLZ2.ORTBEZ18
   end as 'DE_CITY',
    case
        when NEW_PLZ1.SPRACHCODE = '2' then NEW_PLZ1.ORTBEZ18
        when NEW_PLZ2.SPRACHCODE = '2' then NEW_PLZ2.ORTBEZ18
    end as 'FR_CITY',
    case
        when NEW_PLZ1.SPRACHCODE = '3' then NEW_PLZ1.ORTBEZ18
        when NEW_PLZ2.SPRACHCODE = '3' then NEW_PLZ2.ORTBEZ18
    end as 'IT_CITY'
FROM
    NEW_PLZ1
LEFT JOIN NEW_PLZ2 ON NEW_PLZ1.ONRP = NEW_PLZ2.ONRP;

ONRP 是 table 中的主键和 FK。 SPRACHCODE 为德语为 1,法语为 2,意大利语为 3。

通过上面的查询,我得到了我想要的结果——但是一种语言总是单独的一行(因为连接 table 有 2 行)

我尝试使用 GROUP BY ONRP 但出现以下错误:

[42000][1055] SELECT 列表的表达式 #2 不在 GROUP BY 子句中并且包含非聚合列 'adressen.NEW_PLZ2.SPRACHCODE',它在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by

不兼容

我在 Whosebug 上发现如下: -禁用严格模式: 这有助于执行查询。但结果并不好。 (缺失数据,错误数据) - 在 GROUP BY 中添加所有使用的字段 这也适用于执行查询。但也有缺失数据或错误数据。

Atm 我的创造力被打破了,想试试如何解决这个问题。我不知道我还能在这里搜索哪些关键字对我有帮助。

我很乐意为以下人士提供建议: 解决我的 brainbreaker for the group-by 以及为什么它不起作用或如何以其他方式查询所需的输出。

重要提示:查询不会在生产环境中。它将仅用于使用需要的数据创建新的 database/table。

非常感谢您的帮助

使用 Aggregation function

当然你必须测试不同的功能,直到你得到你的结果

SELECT
   NEW_PLZ1.ONRP,
   MAX(case
       when NEW_PLZ1.SPRACHCODE = '1' then NEW_PLZ1.ORTBEZ18
       when NEW_PLZ2.SPRACHCODE = '1' then NEW_PLZ2.ORTBEZ18
   end) as 'DE_CITY',
    MAX(case
        when NEW_PLZ1.SPRACHCODE = '2' then NEW_PLZ1.ORTBEZ18
        when NEW_PLZ2.SPRACHCODE = '2' then NEW_PLZ2.ORTBEZ18
    end) as 'FR_CITY',
    MAX(case
        when NEW_PLZ1.SPRACHCODE = '3' then NEW_PLZ1.ORTBEZ18
        when NEW_PLZ2.SPRACHCODE = '3' then NEW_PLZ2.ORTBEZ18
    end) as 'IT_CITY'
FROM
    NEW_PLZ1
LEFT JOIN NEW_PLZ2 ON NEW_PLZ1.ONRP = NEW_PLZ2.ONRP
GROUP BY NEW_PLZ1.ONRP;