我的情况是我有两张桌子。我想把他们连在一起,让重复的记录出现在同一行上。下面给出的模拟表结构
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
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结果无成功。没有查到任何记录。
发布于 2012-06-26 19:09:49
找到答案了。为了简单起见,我对它做了一些删减,但是只要有可以应用的条件,就像我的例子一样,它工作得很好。
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-26 18:21:46
订正(在此之后的评论意见):
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)(这将无法处理上表中的数据)。
https://stackoverflow.com/questions/11213235
复制相似问题