首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL将多个行选择为一个显示的行

SQL将多个行选择为一个显示的行
EN

Stack Overflow用户
提问于 2012-06-26 17:57:36
回答 2查看 10.3K关注 0票数 0

我的情况是我有两张桌子。我想把他们连在一起,让重复的记录出现在同一行上。下面给出的模拟表结构

MainTbl Cols: MKey1,MKey2,MData1,MData2,MData3

SuppTbl Cols: SPrimaryKey,SKey1,SKey2,SData1,SData2

我想离开加入MainTbl到SuppTbl。但是,SuppTbl包含SKey1和SKey2组合键的副本。

我想要的结果如下,其中"-#“表示复制号。

MKey1,MKey2,MData1,MData2,MData3,SData2 1-1,SData2 2-1,SData2 1-2,SData2 2-2

本质上,联接中的所有字段都应该包含在基于一个Key1和Key2的一行上。

试图回答肖恩W

代码语言:javascript
复制
SELECT
    MainTbl.MKey1,
     MainTbl.MKey2,
    tcd.SData1 AS SData11,  
    tcd.SData2 AS SData22,
    tcr.SData1 AS SData12,  
    tcr.SData2 AS SData22
FROM MainTbl
LEFT JOIN SuppTbl tcd
ON MainTbl.MKey1=tcd.SKey1 AND MainTbl.MKey2=tcd.SKey2
LEFT JOIN SuppTbl tcr
ON MainTbl.MKey1=tcr.SKey1 AND MainTbl.MKey2=tcr.SKey2
WHERE tcd.SData1 < tcr.SData1

结果无成功。没有查到任何记录。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-26 19:09:49

找到答案了。为了简单起见,我对它做了一些删减,但是只要有可以应用的条件,就像我的例子一样,它工作得很好。

代码语言:javascript
复制
SELECT 
    MainTbl.MKey1,
    MainTbl.MKey2,
    tcd.stat AS SData11,
    tcr.stat AS SData12
FROM MainTbl
LEFT JOIN(
    SELECT * FROM SuppTbl WHERE SData1 <> 22
) tcd
ON MainTbl.MKey1=tcd.SKey1 AND MainTbl.MKey2=tcd.SKey2
LEFT JOIN(
    SELECT * FROM SuppTbl WHERE SData1 = 22
) tcr
ON MainTbl.MKey1=tcr.SKey1 AND MainTbl.MKey2=tcr.SKey2
票数 2
EN

Stack Overflow用户

发布于 2012-06-26 18:21:46

订正(在此之后的评论意见):

代码语言:javascript
复制
CREATE TABLE MainTbl (MKey1 int,MKey2 int,MData1 varchar(10),MData2 varchar(10),MData3 varchar(10))
CREATE TABLE SuppTbl (SPrimaryKey int,SKey1 int,SKey2 int,SData1 varchar(10),SData2 varchar(10))

INSERT INTO MainTbl VALUES (1, 1, '1MData1', '1MData2', '1MData3')
INSERT INTO SuppTbl VALUES (1, 1, 1, '1SData1-1', '1SData2-1')
INSERT INTO SuppTbl VALUES (2, 1, 1, '1SData1-2', '1SData2-2')

INSERT INTO MainTbl VALUES (1, 2, '2MData1', '2MData2', '2MData3')
INSERT INTO SuppTbl VALUES (3, 1, 2, '2SData1-1', '2SData2-1')

SELECT
    MainTbl.MKey1,
    MainTbl.MKey2,
    tcd.SData1 AS SData11,  
    tcd.SData2 AS SData22,
    tcr.SData1 AS SData12,  
    tcr.SData2 AS SData22
FROM MainTbl
INNER JOIN SuppTbl tcd
ON MainTbl.MKey1=tcd.SKey1 AND MainTbl.MKey2=tcd.SKey2
LEFT JOIN SuppTbl tcr
ON MainTbl.MKey1=tcr.SKey1 AND MainTbl.MKey2=tcr.SKey2
AND tcd.SPrimaryKey < tcr.SPrimaryKey

现在,对于SuppTbl中有2行的实例,这将不能100%地工作:它将给出两个结果行-一个是好的,另一个是想要排除的。要排除它,您必须提供一些更多的信息,说明如何标识其将具有>1 SuppTbl行的实例。您在上面的注释"WHERE Data1 = 4“中提到过。所以这需要成为WHERE子句的一部分。应该是这样的:

代码语言:javascript
复制
 WHERE tcd.SData1 = 4

这可能会排除单个SuppTbl行。因此,您需要提供有关如何不过滤掉该行的信息。也许:

代码语言:javascript
复制
 WHERE tcd.SData1 IN (4, 22)

(这将无法处理上表中的数据)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11213235

复制
相关文章

相似问题

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