SQL Distinct Left Join

问题描述 投票:1回答:3

我有一个问题,我试图从我的主表中找到一个不同的值,其中t2中不同列的文本值不存在。例如。

   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”

sql-server left-join
3个回答
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

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' 

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')

真的很感激回应。

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.