首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接结果中唯一ID的重复输入

连接结果中唯一ID的重复输入
EN

Stack Overflow用户
提问于 2015-11-19 07:07:51
回答 3查看 101关注 0票数 3

提供程序

代码语言:javascript
复制
ID  NAME
1   name1
2   name2
3   name3

Lang

代码语言:javascript
复制
ID  Lan
1   English
2   English
2   Tamil
3   English
3   Tamil
3   Telugu

连接结果是

代码语言:javascript
复制
1   name1   English
2   name2   English
2   name2   Tamil
3   name3   English
3   name3   Tamil
3   name3   Telugu

但我需要这样的结果

代码语言:javascript
复制
id  Name   Lan1    Lan2  Lan3
1   name1  English NULL  NULL
2   name2  English Tamil NULL
3   name3  English Tamil TELUGU

你能帮帮我吗

EN

回答 3

Stack Overflow用户

发布于 2015-11-19 07:19:22

试试这个枢轴查询,它应该同时适用于MySQL和Server (您从未告诉我们您真正使用的是哪一个)。MAX()函数应该忽略这两个关系数据库的null值。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2015-11-19 07:37:40

关于mysql

代码语言:javascript
复制
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的回答

代码语言:javascript
复制
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上的构建模式脚本。

代码语言:javascript
复制
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

代码语言:javascript
复制
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小提琴

票数 0
EN

Stack Overflow用户

发布于 2015-11-19 08:23:40

如果您使用Server,您应该更改@Alice代码,因为限制1不能工作,而应该使用TOP 1。

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33797303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档