来源:
CREATE TABLE #TempTab (ID INT, Value INT, Value1 varchar(10), Value2 varchar(10), value_ INT, Value1_ varchar(10), Value2_ varchar(10), Value3_ varchar(10), Limit INT)
INSERT INTO #TempTab
SELECT 1, 1,'One','One',1,'One','One','Yes',2
UNION ALL
SELECT 1, 1,'One','One',1,'One','Two','No',2
当前查询尝试:
SELECT
t1.ID,
CA.Value3_
FROM
#TempTab t1
CROSS APPLY(
SELECT
Value,
Value3_
FROM
#TempTab t2
WHERE
t1.Value = t2.Value_ AND
t1.Value1 = t2.Value1_ AND
t1.Value2 = t2.Value2_ AND
t1.Limit > 1
) CA
DROP TABLE #TempTab
当前输出:
ID Value3_
1 Yes
1 Yes
期望的输出:
ID Value3_
1 Yes
目标:
我想返回记录(ID和Value3_),其中Value,Value1和Value2与Value_,Value1_和Value2_匹配。根据当前的逻辑,我得到两个记录返回。我只想要第一条记录(ID = 1和Value3_ =“是”)。
答案 0 :(得分:2)
问题是你要比较两条线路。我假设您只想找到第一行,但第二行(t1)将匹配第一行(t2),这是您获得的第二行。
不确定你在做什么,但只需使用一张表即可得到结果:
SELECT
t1.ID,
t1.Value3_
FROM
#TempTab t1
where
t1.Value = t1.Value_ AND
t1.Value1 = t1.Value1_ AND
t1.Value2 = t1.Value2_ AND
t1.Limit > 1
中查看此内容
答案 1 :(得分:1)
除了@JamesZ点之外,假设ID在原始临时表中是幂等的,例如你是这个意思:
CREATE TABLE #TempTab (ID INT, Value INT, Value1 varchar(10), Value2 varchar(10),
value_ INT, Value1_ varchar(10), Value2_ varchar(10),
Value3_ varchar(10), Limit INT)
INSERT INTO #TempTab
SELECT 1, 1,'One','One',1,'One','One','Yes',2
UNION ALL
SELECT 2, 1,'One','One',1,'One','Two','No',2;
在使用同一个表时消除双向连接的一种常用方法是使用>
对自主连接与主键进行比较,以消除重复的'对角线的一半。另请注意,如果您只处理表格(即不是FUNCTION
),JOIN
就足以代替CROSS APPLY
:
SELECT
t1.ID,
x.Value3_
FROM
#TempTab t1
INNER JOIN (
SELECT
ID,
Value,
Value1_,
Value2_,
Value3_
FROM
#TempTab t2
) x
ON
t1.Value = x.Value AND
t1.Value1 = x.Value1_ AND
t1.Value2 = x.Value2_ AND
t1.Limit > 1
AND t1.ID > x.ID;