Sql server 一个表-两个字段-相同值-T/SQL
资料来源: 当前查询尝试:Sql server 一个表-两个字段-相同值-T/SQL,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,资料来源: 当前查询尝试: 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 U
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),其中Value、Value1和Value2与Value、Value1和Value2匹配。按照目前的逻辑,我得到两条记录。我只想要第1条记录(ID=1和Value3_u=“Yes”)。问题在于,您正在将这两行与它们自己进行比较。我假设您只想找到第一行,但是第二行(t1)将与第一行(t2)匹配,这是您得到的第二个结果 不确定您在做什么,但您只需使用一个表即可获得该结果:
ID Value3_
1 Yes
除了@JamesZ point之外,在中检查此项,假设ID在原始临时表中是幂等的,例如,您的意思是:
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
在使用同一个表时,消除双向联接的一种常见方法是使用
将自联接与主键进行比较,以消除对角线的“重复”一半。还请注意,如果您只处理表(即不是函数
),则连接
就足够了,而不是交叉应用
:
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;
我不确定你的目标是什么。请你重新措辞好吗。谢谢你的两行实际上也有相同的
ID
吗?是的,这就是我要做的。不知道可以在一个表中包含WHERE子句,并将两个diff列等效为这样。。。非常感谢你!啊,我知道你做了什么。您进行了子查询并加入了外部。。。整洁的非常感谢。
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;