0

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

MainTbl 列:MKey1、MKey2、MData1、MData2、MData3

SuppTbl 列:SPrimaryKey、SKey1、SKey2、SData1、SData2

我想 LEFT 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

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

4

2 回答 2

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

 WHERE tcd.SData1 = 4

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

 WHERE tcd.SData1 IN (4, 22)

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

于 2012-06-26T18:21:46.810 回答
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
于 2012-06-26T19:09:49.313 回答