SQL在显示的一行中选择多行

时间:2012-06-26 17:57:36

标签: sql sql-server tsql row

我的情况是我有两张桌子。我想将它们连接在一起,并在同一行显示重复的记录。模拟表结构如下所示

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

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

我想LETER JOIN MainTbl到SuppTbl。但是,SuppTbl包含重复的SKey1和SKey2组合键。

我想要的结果如下,其中“ - #”表示重复编号。

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

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

SEAN W的解答答案

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

结果没有成功。没有拉任何记录。

2 个答案:

答案 0 :(得分:4)

修订(后评论):

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%运行:它将提供两个结果行 - 一个将没有问题,另一个将要排除。要排除它,您必须提供一些有关如何识别具有&gt; 1 SuppTbl行的实例的更多信息。您在上面的评论“WHERE Data1 = 4”中提到过。所以这需要成为WHERE子句的一部分。它会是这样的:

 WHERE tcd.SData1 = 4

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

 WHERE tcd.SData1 IN (4, 22)

(这不适用于上表中的数据)。

答案 1 :(得分:2)

找到答案。为了简单起见,我把它修剪了一下,但只要有可以应用的WHERE条件,它就会很好用,就像我的情况一样。

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
相关问题