SQL Distinct Left Join

时间:2018-03-06 11:18:05

标签: sql-server left-join

我有一个问题,我正在尝试从主表中找到一个不同的值,其中t2中不同列的文本值不存在。 E.G。

   SELECT t1.val, t2.desc
     FROM t1 
LEFT JOIN t2 
       On t1.val = t2.val
      And t2.desc NOT LIKE 'some text' 

我遇到的问题是我正在检索t1.val的重复值,因为t2.desc具有除“some text”之外的其他变量值。

由于t2.desc是文本而无法比较,因此区别不起作用。

我已经搜索了其他几个似乎相似的问题,但却找不到符合我标准的问题。

我一直在努力让这个工作整个上午都工作,并且非常感谢从t1获得不同值的帮助。

谢谢

尝试了这些建议后,我仍然看到输出中的t1.val的倍数

  t1.Val  t2.[desc]
  1811352  Process
  1811352  Conversion
  1811352  State
  1811352  Test
  1811352  Work

我正在寻找的所需输出是单个t1.val,其中t2中没有特定文本的值。[desc]。因此试图得到一个不明确的t1.val,其中t2。[desc]特定文本不出现在t2中的任何地方。[desc]。

所以在上面的例子中我想看一次1811352因为它不包含t2。[desc]“some text”

3 个答案:

答案 0 :(得分:0)

如果您需要的是仅基于Val进行区分,请尝试此

;WITH CTE
AS
(
    SELECT 
       RN = ROW_NUMBER() OVER(PARTITION BY t1.val ORDER BY t1.val),
       t1.val,
       t2.[desc]
       FROM t1
          LEFT JOIN t2 
             ON t1.val = t2.val
                AND t2.[desc] NOT LIKE 'some text'
)
SELECT
    val,
    [desc]
    FROM CTE
       WHERE RN = 1

答案 1 :(得分:0)

您不应该使用TEXT数据类型,它已被弃用。而不是这个,你应该使用VARCHAR(MAX)

快速解决方案,如果您无法将其更改为VARCHAR(MAX),则可以CAST将其更改为VARCHAR(MAX)并应用DISTINCT

SELECT DISTINCT t1.val, CAST(t2.[desc] AS VARCHAR(MAX))
FROM t1 
LEFT JOIN t2 on t1.val = t2.val
AND t2.[desc] NOT LIKE 'some text' 

答案 2 :(得分:0)

我想我最终得到的是以下内容:

SELECT t1.val
     FROM t1 
WHERE NOT EXISTS
    (SELECT t2.[desc] FROM t2 WHERE t1.val = t2.val
      And t2.[desc] LIKE 'some text')

真的很感激回应。

由于