Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将多个列合并到一个列中,保持相似性并替换差异_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 将多个列合并到一个列中,保持相似性并替换差异

Sql server 将多个列合并到一个列中,保持相似性并替换差异,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我需要一个可以在一个查询中合并多个列的查询 例如,我有以下列的行: 'JOHNNY WALKER KILIAN JOURNET ANNA FROST' 'JOHNNY CUERVO KILIAN JOURNET ANNA FROST' 'JOHNNY WALKER KILIAN JONES ANNA FROST' 'JOHNNY WALKER KILIAN JOURNET EMELIE FROST' 然后我想将所有行合并为一行: 'JOHNNY CUERVO KILIAN JONES EMEL

我需要一个可以在一个查询中合并多个列的查询

例如,我有以下列的行:

'JOHNNY WALKER KILIAN JOURNET ANNA FROST'
'JOHNNY CUERVO KILIAN JOURNET ANNA FROST'
'JOHNNY WALKER KILIAN JONES ANNA FROST'
'JOHNNY WALKER KILIAN JOURNET EMELIE FROST'
然后我想将所有行合并为一行:

'JOHNNY CUERVO KILIAN JONES EMELIE FROST'
有可能这样做吗? 这是因为我正在尝试执行一个动态查询,然后从XML中检索条件,但我不知道我将从XML中获得多少条件,因此我正在尝试使用CTE从XML中循环条件并替换dinamic查询。 最后,我得到了许多带有查询和一些条件的行。。所以我需要合并差异并保持相似性

XML是:

<ROOT>
  <PARAMETROS>
    <USU_LOGIN>yleon</USU_LOGIN>
    <USU_NOMBREPRIMERO>Yerusha</USU_NOMBREPRIMERO>
    <USU_APELLIDOPRIMERO>Leon</USU_APELLIDOPRIMERO>
    <USU_EMAIL>yleon@email.com.ve</USU_EMAIL>
    <USU_FECHACREACION>20130510</USU_FECHACREACION>
    <USU_CODICIONES1 TIPO="MC" MARCADOR="CONDICIONES1">AND USU_ID=1</USU_CODICIONES1>
    <USU_CODICIONES2 TIPO="MC" MARCADOR="CONDICIONES2">AND USU_ID=2</USU_CODICIONES2>
    <USU_CODICIONES3 TIPO="MC" MARCADOR="CONDICIONES3">AND USU_ID=3</USU_CODICIONES3>
    <USU_CODICIONES4 TIPO="MC" MARCADOR="CONDICIONES4">AND USU_ID=4</USU_CODICIONES4>
    <USU_CODICIONES5 TIPO="MC" MARCADOR="CONDICIONES5">AND USU_ID=5</USU_CODICIONES5>
    <USU_CODICIONES6 TIPO="MC" MARCADOR="CONDICIONES6">AND USU_ID=6</USU_CODICIONES6>        
  </PARAMETROS>
</ROOT>

以下是一个主要的XQuery解决方案:

declare @xml xml
set @xml = '<ROOT>
  <PARAMETROS>
    <USU_LOGIN>yleon</USU_LOGIN>
    <USU_NOMBREPRIMERO>Yerusha</USU_NOMBREPRIMERO>
    <USU_APELLIDOPRIMERO>Leon</USU_APELLIDOPRIMERO>
    <USU_EMAIL>yleon@email.com.ve</USU_EMAIL>
    <USU_FECHACREACION>20130510</USU_FECHACREACION>
    <USU_CODICIONES1 TIPO="MC" MARCADOR="CONDICIONES1">AND USU_ID=1</USU_CODICIONES1>
    <USU_CODICIONES2 TIPO="MC" MARCADOR="CONDICIONES2">AND USU_ID=2</USU_CODICIONES2>
    <USU_CODICIONES3 TIPO="MC" MARCADOR="CONDICIONES3">AND USU_ID=3</USU_CODICIONES3>
    <USU_CODICIONES4 TIPO="MC" MARCADOR="CONDICIONES4">AND USU_ID=4</USU_CODICIONES4>
    <USU_CODICIONES5 TIPO="MC" MARCADOR="CONDICIONES5">AND USU_ID=5</USU_CODICIONES5>
    <USU_CODICIONES6 TIPO="MC" MARCADOR="CONDICIONES6">AND USU_ID=6</USU_CODICIONES6>        
  </PARAMETROS>
</ROOT>'

DECLARE @QUERY VARCHAR(MAX)
SELECT @QUERY = CONVERT(VARCHAR(MAX),
    @xml.query('
        "SELECT * FROM CAIN..USUARIOS WHERE 1=1",
        for $cond in /ROOT/PARAMETROS/*[fn:substring(fn:local-name(), 1, 14) = "USU_CODICIONES" and @TIPO="MC"]/text()
            return string($cond)'))

PRINT @QUERY

以下是一个主要的XQuery解决方案:

declare @xml xml
set @xml = '<ROOT>
  <PARAMETROS>
    <USU_LOGIN>yleon</USU_LOGIN>
    <USU_NOMBREPRIMERO>Yerusha</USU_NOMBREPRIMERO>
    <USU_APELLIDOPRIMERO>Leon</USU_APELLIDOPRIMERO>
    <USU_EMAIL>yleon@email.com.ve</USU_EMAIL>
    <USU_FECHACREACION>20130510</USU_FECHACREACION>
    <USU_CODICIONES1 TIPO="MC" MARCADOR="CONDICIONES1">AND USU_ID=1</USU_CODICIONES1>
    <USU_CODICIONES2 TIPO="MC" MARCADOR="CONDICIONES2">AND USU_ID=2</USU_CODICIONES2>
    <USU_CODICIONES3 TIPO="MC" MARCADOR="CONDICIONES3">AND USU_ID=3</USU_CODICIONES3>
    <USU_CODICIONES4 TIPO="MC" MARCADOR="CONDICIONES4">AND USU_ID=4</USU_CODICIONES4>
    <USU_CODICIONES5 TIPO="MC" MARCADOR="CONDICIONES5">AND USU_ID=5</USU_CODICIONES5>
    <USU_CODICIONES6 TIPO="MC" MARCADOR="CONDICIONES6">AND USU_ID=6</USU_CODICIONES6>        
  </PARAMETROS>
</ROOT>'

DECLARE @QUERY VARCHAR(MAX)
SELECT @QUERY = CONVERT(VARCHAR(MAX),
    @xml.query('
        "SELECT * FROM CAIN..USUARIOS WHERE 1=1",
        for $cond in /ROOT/PARAMETROS/*[fn:substring(fn:local-name(), 1, 14) = "USU_CODICIONES" and @TIPO="MC"]/text()
            return string($cond)'))

PRINT @QUERY

这里有一个更好的解决方案,更简单,潜在的小事故,更快,由@Alexander Fedorenko提供,我刚刚针对这个问题进行了调整:

DECLARE @xml XML = '<ROOT>
  <PARAMETROS>
    <USU_LOGIN>yleon</USU_LOGIN>
    <USU_NOMBREPRIMERO>Yerusha</USU_NOMBREPRIMERO>
    <USU_APELLIDOPRIMERO>Leon</USU_APELLIDOPRIMERO>
    <USU_EMAIL>yleon@email.com.ve</USU_EMAIL>
    <USU_FECHACREACION>20130510</USU_FECHACREACION>
    <USU_CODICIONES1 TIPO="MC" MARCADOR="CONDICIONES1">AND USU_ID=1</USU_CODICIONES1>
    <USU_CODICIONES2 TIPO="MC" MARCADOR="CONDICIONES2">OR USU_ID=2</USU_CODICIONES2>
    <USU_CODICIONES3 TIPO="MC" MARCADOR="CONDICIONES3">OR USU_ID=3</USU_CODICIONES3>
    <USU_CODICIONES4 TIPO="MC" MARCADOR="CONDICIONES4">OR USU_ID=4</USU_CODICIONES4>
    <USU_CODICIONES5 TIPO="MC" MARCADOR="CONDICIONES5">OR USU_ID=5</USU_CODICIONES5>
    <USU_CODICIONES6 TIPO="MC" MARCADOR="CONDICIONES6">OR USU_ID=6</USU_CODICIONES6>        
  </PARAMETROS>
</ROOT>'

DECLARE @QUERY NVARCHAR(MAX)

SET @QUERY = 'SELECT * FROM USUARIOS WHERE 1=1 CONDICIONES1 CONDICIONES2 CONDICIONES3 CONDICIONES4 CONDICIONES5 CONDICIONES6'             

  DECLARE  @dsql nvarchar(max)

  SELECT @dsql = REPLACE(COALESCE(@dsql, @QUERY), 
                         T.Item.value('@MARCADOR', 'varchar(255)'),
                         T.Item.value('data(.)', 'varchar(255)'))         
  FROM   @xml.nodes('/ROOT/PARAMETROS/*') AS T(Item)  
  WHERE T.Item.value('data(@TIPO)', 'varchar(255)')='MC'

PRINT @DSQL

这里有一个更好的解决方案,更简单,潜在的小事故,更快,由@Alexander Fedorenko提供,我刚刚针对这个问题进行了调整:

DECLARE @xml XML = '<ROOT>
  <PARAMETROS>
    <USU_LOGIN>yleon</USU_LOGIN>
    <USU_NOMBREPRIMERO>Yerusha</USU_NOMBREPRIMERO>
    <USU_APELLIDOPRIMERO>Leon</USU_APELLIDOPRIMERO>
    <USU_EMAIL>yleon@email.com.ve</USU_EMAIL>
    <USU_FECHACREACION>20130510</USU_FECHACREACION>
    <USU_CODICIONES1 TIPO="MC" MARCADOR="CONDICIONES1">AND USU_ID=1</USU_CODICIONES1>
    <USU_CODICIONES2 TIPO="MC" MARCADOR="CONDICIONES2">OR USU_ID=2</USU_CODICIONES2>
    <USU_CODICIONES3 TIPO="MC" MARCADOR="CONDICIONES3">OR USU_ID=3</USU_CODICIONES3>
    <USU_CODICIONES4 TIPO="MC" MARCADOR="CONDICIONES4">OR USU_ID=4</USU_CODICIONES4>
    <USU_CODICIONES5 TIPO="MC" MARCADOR="CONDICIONES5">OR USU_ID=5</USU_CODICIONES5>
    <USU_CODICIONES6 TIPO="MC" MARCADOR="CONDICIONES6">OR USU_ID=6</USU_CODICIONES6>        
  </PARAMETROS>
</ROOT>'

DECLARE @QUERY NVARCHAR(MAX)

SET @QUERY = 'SELECT * FROM USUARIOS WHERE 1=1 CONDICIONES1 CONDICIONES2 CONDICIONES3 CONDICIONES4 CONDICIONES5 CONDICIONES6'             

  DECLARE  @dsql nvarchar(max)

  SELECT @dsql = REPLACE(COALESCE(@dsql, @QUERY), 
                         T.Item.value('@MARCADOR', 'varchar(255)'),
                         T.Item.value('data(.)', 'varchar(255)'))         
  FROM   @xml.nodes('/ROOT/PARAMETROS/*') AS T(Item)  
  WHERE T.Item.value('data(@TIPO)', 'varchar(255)')='MC'

PRINT @DSQL

四个查询中的每一个最多返回一行?最好给出一个简单的例子,使用有效的语法,而不是condicines1等伪代码。它们只是文本,不像查询一样。。我最好重写这个例子..期望结果背后的逻辑是什么?沃克被代表了三次,为什么达蒙会被保留?-1因为没有告诉我们你是如何/为什么得到期望的结果的。你只是想要随机的一行吗?我正在尝试做一个动态查询,其中一些条件被转换成XML,我需要循环XML并替换动态查询的每个条件,我使用一个cte表来做这件事。四个查询中的每一个最多返回一行?最好给出一个简单的例子,使用有效的语法,而不是condicines1等伪代码。它们只是文本,不像查询一样。。我最好重写这个例子..期望结果背后的逻辑是什么?沃克被代表了三次,为什么达蒙会被保留?-1因为没有告诉我们你是如何/为什么得到期望的结果的。你只是想要随机的一行吗?我正在尝试做一个动态查询,其中一些条件被转换成XML,我需要循环XML并替换动态查询的每个条件,我使用一个cte表来做这件事..是的,但是原始查询可能没有这么简单。。它可以有许多子选择和许多条件在哪里部分…啊,好吧,值得一试。我认为MS SQL的xquery实现不够完整,不能做更多的工作。这只是出于兴趣,真的-您已经有了一个很好的SQL解决方案是的,但是最初的查询可能不是那么简单。。它可以有许多子选择和许多条件在哪里部分…啊,好吧,值得一试。我认为MS SQL的xquery实现不够完整,不能做更多的工作。这只是出于兴趣,真的-您已经有了一个很好的SQL解决方案