我们有一个CountryDtls表,其中包含国家名称,执行的活动和年份。
我只需要识别艺术和学院之间年份值不同的那些行,并以下面给出的不同格式显示

原始清单:

年|国家名称|活动|
------ | ------------ | ------------ |
1987 |印度|艺术|
1987 |印度|科学|
1876 |印度|学院|
1876 | Aus |艺术|
1836 | Aus |科学|
1876 | Aus |学院|
1976年|美国|艺术|
1976年|美国|科学|
1976年|美国|学院|


预期结果:

CountryName |艺术|学院|
------------ | ----- | -------- |
印度| 1987 | 1876 |


我可以使用以下查询获得结果。有没有更好的方法来达到预期的效果?

选择c.CountryName,(从CountryDtls选择Year,其中environment =“ Arts”和c.CountryName = CountryName)
,(从CountryDtls的环境中选择Year,其中environment =“ Academy”和c.CountryName = CountryName)从CountryDtls选为Academy,而c where environment =“ Arts” AND environment =“ Arts” AND(CountryName)IN(从CountryDtls中选择CountryName,其中environment =“学院”)和(年份)不在(从CountryDtls中选择年份,其中environment =“ Academy”)

最佳答案

我认为自我联接(使用子查询)提供了最清晰的解决方案:

SELECT
    Arts.CountryName,
    Arts.Yr AS Arts,
    Academy.Yr AS Academy
FROM
    (
        SELECT Yr, CountryName, Activity
        FROM CountryDtls WHERE Activity = 'Arts'
    ) AS Arts
    INNER JOIN
    (
        SELECT Yr, CountryName, Activity
        FROM CountryDtls WHERE Activity = 'Academy'
    ) AS Academy ON
        Academy.CountryName = Arts.CountryName
WHERE Arts.Yr <> Academy.Yr


如果您的MySQL≥8.0,则可以使用CTE使其更具可读性:

WITH
    Arts AS
    (
        SELECT yr, CountryName, Activity
        FROM CountryDtls WHERE Activity = 'Arts'
    ),
    Academy AS
    (
        SELECT yr, CountryName, Activity
        FROM CountryDtls WHERE Activity = 'Academy'
    )
SELECT
    Arts.CountryName,
    Arts.Yr AS Arts,
    Academy.Yr AS Academy
FROM Arts INNER JOIN Academy ON Academy.CountryName = Arts.CountryName
WHERE Arts.Yr <> Academy.Yr

10-05 18:47