【问题标题】:SQL developer - duplicate entry of unique ID in join resultSQL 开发人员 - 连接结果中的唯一 ID 重复条目
【发布时间】:2016-02-21 04:57:33
【问题描述】:

提供者

ID  NAME
1   name1
2   name2
3   name3

表格语言

ID  Lan
1   English
2   English
2   Tamil
3   English
3   Tamil
3   Telugu

连接结果是

1   name1   English
2   name2   English
2   name2   Tamil
3   name3   English
3   name3   Tamil
3   name3   Telugu

但我需要这样的结果

id  Name   Lan1    Lan2  Lan3
1   name1  English NULL  NULL
2   name2  English Tamil NULL
3   name3  English Tamil TELUGU

你能帮忙吗

【问题讨论】:

  • MySQL 还是 SQL Server?
  • 透视是唯一的答案。如果语言数量是动态的,那么动态透视sql

标签: mysql sql-server


【解决方案1】:

试试这个透视查询,它应该在 MySQL 和 SQL Server 上都可以工作(你从来没有告诉我们你真正使用的是哪一个)。 MAX() 函数应该忽略这两个 RDBMS 的 null 值。

SELECT t.ID, t.NAME, MAX(t.Lan1) AS Lan1, MAX(t.Lan2) AS Lan2, MAX(t.Lan3) AS Lan3
FROM
(
    SELECT p.ID, p.NAME,
        CASE WHEN l.Lan = 'English' THEN 'English' ELSE null END AS Lan1,
        CASE WHEN l.Lan = 'Tamil'   THEN 'Tamil'   ELSE null END AS Lan2
        CASE WHEN l.Lan = 'Telugu'  THEN 'Telugu'  ELSE null END AS Lan3
    FROM Provider p INNER JOIN Lang l ON p.ID = l.ID
) t
GROUP BY t.ID, t.NAME

【讨论】:

    【解决方案2】:

    如果您使用 SQL-Server,您应该更改 @Alice 代码,因为 LIMIT 1 不起作用,而是使用 TOP 1。

    select ID,NAME 
    ,(select TOP 1 LAN from LANG where LANG.id=PROVIDER.ID and LAN='English')  
    as LAN1 
    ,(select TOP 1 LAN from LANG where LANG.id=PROVIDER.ID and LAN='Tamil')  
    as LAN2 
    ,(select TOP 1 LAN from LANG where LANG.id=PROVIDER.ID and LAN='Telugu')  
    as LAN3 
    from PROVIDER;
    

    【讨论】:

      【解决方案3】:

      在 mysql 上

      select ID,NAME
      ,(select LAN from LANG where LANG.id=PROVIDER.ID and LAN='English' limit 1)  
      as LAN1 
      ,(select LAN from LANG where LANG.id=PROVIDER.ID and LAN='Tamil' limit 1)  
      as LAN2 
      ,(select LAN from LANG where LANG.id=PROVIDER.ID and LAN='Telugu' limit 1)  
      as LAN3 
      from PROVIDER;
      

      在 sqlserver 上感谢 @Bungicasse 的回答

      select ID,NAME
      ,(select TOP 1 LAN from LANG where LANG.id=PROVIDER.ID and LAN='English')  
      as LAN1 
      ,(select TOP 1 LAN from LANG where LANG.id=PROVIDER.ID and LAN='Tamil' )  
      as LAN2 
      ,(select TOP 1 LAN from LANG where LANG.id=PROVIDER.ID and LAN='Telugu')  
      as LAN3 
      from PROVIDER;
      

      和构建模式脚本 在mysql上

      drop table if exists  LANG;
      drop table if exists  PROVIDER;
      CREATE TABLE LANG (
        ID int(11) NOT NULL,
        LAN varchar(255) NOT NULL
      );
      INSERT INTO lang (ID, Lan) VALUES (1, 'English');
      INSERT INTO lang (ID, Lan) VALUES (2, 'English');
      INSERT INTO lang (ID, Lan) VALUES (2, 'Tamil');
      INSERT INTO lang (ID, Lan) VALUES (3, 'English');
      INSERT INTO lang (ID, Lan) VALUES (3, 'Tamil');
      INSERT INTO lang (ID, Lan) VALUES (3, 'Telugu');
      
      CREATE TABLE PROVIDER (
        ID int(11) NOT NULL,
        NAME varchar(255) NOT NULL,
        PRIMARY KEY  (ID)
      );
      
      INSERT INTO PROVIDER VALUES (1, 'name1');
      INSERT INTO PROVIDER VALUES (2, 'name2');
      INSERT INTO PROVIDER VALUES (3, 'name3');
      

      在 mssql 上

      CREATE TABLE LANG (
        ID INTEGER NOT NULL,
        LAN varchar(255) NOT NULL
      );
      INSERT INTO lang (ID, Lan) VALUES (1, 'English');
      INSERT INTO lang (ID, Lan) VALUES (2, 'English');
      INSERT INTO lang (ID, Lan) VALUES (2, 'Tamil');
      INSERT INTO lang (ID, Lan) VALUES (3, 'English');
      INSERT INTO lang (ID, Lan) VALUES (3, 'Tamil');
      INSERT INTO lang (ID, Lan) VALUES (3, 'Telugu');
      
      CREATE TABLE PROVIDER (
        ID INTEGER NOT NULL,
        NAME varchar(255) NOT NULL,
        PRIMARY KEY  (ID)
      );
      
      INSERT INTO PROVIDER VALUES (1, 'name1');
      INSERT INTO PROVIDER VALUES (2, 'name2');
      INSERT INTO PROVIDER VALUES (3, 'name3');
      

      在这里测试一下

      sql fiddle

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-21
        • 2019-03-06
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        • 2011-12-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多