一个表 - 两个字段 - 相同的值 - T / SQL

时间:2015-06-16 17:30:26

标签: 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
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_ =“是”)。

2 个答案:

答案 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

SQL Fiddle

中查看此内容

答案 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;

SqlFiddle