关于我的这个 SQL Server 查询的问题

Posted

技术标签:

【中文标题】关于我的这个 SQL Server 查询的问题【英文标题】:Question about this SQL Server query of mine 【发布时间】:2020-06-11 03:44:34 【问题描述】:

我在 SQL Server 2008 中有一个表,它有 2 列,如下所示:

如果 1 个随机值在 A 列或 B 列中显示 1 次,我不会移动值列 A 和 B。** 如果 1 个随机值在 B 列中再显示 1 次,我会将值从 B 列移动到 A 列,并且值从 A 列到 B 列。** 如果 1 个值随机在 A 列中显示 1 次以上,我仍然不移动 A 列和 B 列的值

我尝试过计数,但没有实现。

我需要在 SQL 中完成这一切。

我的查询演示demo

Select columnA,columnB
from myTable t1
Where t1.columnA in (
select columnA
from myTable
group by columnA
Having count(*)>1)
union
Select columnB,columnA
from myTable t1
Where t1.columnB in (
select columnB
from myTable
group by columnB
Having count(*)>1) 

我的查询有 1 个错误 第 7、10 和 12 行未显示。输入 9 行,仅输出 6 行。缺失:

('H','A')
('Y','L')
('M','N')

我需要完整 9 行的结果。

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:

这是一种方法。我用 WITH 块将其分解,以便您更好地了解各个阶段:

--this will turn the data into a single column so we can effectively count e.g. the Y to be 4
WITH xc AS (
  SELECT letter, COUNT(*) ct
  FROM
    (
      SELECT columnA as letter FROM myTable
      UNION ALL
      SELECT columnB FROM myTable
    ) l
  GROUP BY letter
),
--this joins the counts back to the main table twice, so we can know the letter in
--each column but also how many times that letter occurs anywhere
--we must join twice because we have two columns. If we instead used one join and OR
--it would cause extra rows to appear, which we don't want
 j AS (
  SELECT myTable.ColumnA, myTable.ColumnB, ac.ct as act, bc.ct as bct
  FROM myTable
  INNER JOIN xc ac ON ac.letter = myTable.ColumnA
  INNER JOIN xc bc ON bc.letter = myTable.ColumnB
)

--now we use the "count of column a" (act) and "could of column b" (bct) to decide
--"if column a count > column b count, put column a else b" and its inverse logic
--"if column a count < column b count, put column a else b"
--but this doesnt cater for if both are equally 1 (like M,N) so we extend the logic
--of the first with an >=
SELECT 
  CASE WHEN j.act >= j.bct THEN j.columnA ELSE j.columnB END as columngroup, 
  CASE WHEN j.act < j.bct THEN j.columnA ELSE j.columnB END as columnx 
FROM j

顺便说一句,如果你有一个源行,例如 A,Y,其中两个都是 4,没有说明该怎么做,所以在这种情况下,这个查询将把 A,Y

编辑:

您说 M,N 和 N,M 将被视为重复,在这种情况下,我们可以尝试将 j 查询替换为:

  SELECT DISTINCT
    CASE WHEN m.columnA < m.columnB THEN m.columnA ELSE m.columnB END as columnA, 
    CASE WHEN m.columnA < m.columnB THEN m.columnB ELSE m.columnA END as columnB, 
    ac.ct as act, 
    bc.ct as bct
  FROM myTable m
  INNER JOIN xc ac ON ac.letter = m.ColumnA
  INNER JOIN xc bc ON bc.letter = m.ColumnB

它翻转 N,M -> M,N 然后使用 DISTINCT 删除它

【讨论】:

你能帮我吗?我在您的查询中发现 1 个错误案例,考试:dbfiddle.uk/… 第 5 行和第 6 行中的输出错误。如果 2 行如 (exam ('M','N') 和 ('N','M')) 我会坚持它是双倍的,我只想查看 1 行 但它们是不同的行;这不是查询中的错误案例。原始问题中从未说明如果两个字母出现两次并且原始数据没有处理这种情况该怎么办。我仍然不太清楚你想做什么.. M,N 是 N,M 的副本吗?在这种情况下,我们需要一个步骤来删除重复项,并且可能最好的方法是将它们翻转,使 N,M 变为 M,N 并在我们加入时区分它们 感谢您的帮助,我将删除重复的行,之后我将使用您的查询。非常感谢

以上是关于关于我的这个 SQL Server 查询的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于sql server查询的where不识别列名的问题

SQL Server 关于 Table 字典数据的查询SQL

深入浅出的 SQL Server 查询优化

关于SQL Server 2000 Varchar长度的一个问题!!请高手解答

关于重构sql查询

sqlserver关于用一个sql语句批量添加数据的问题