Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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 如何将未知数量的行连接到另一行?_Sql_Sql Server 2005 - Fatal编程技术网

Sql 如何将未知数量的行连接到另一行?

Sql 如何将未知数量的行连接到另一行?,sql,sql-server-2005,Sql,Sql Server 2005,我有这样一个场景: 表A: --------------- ID| SOME_VALUE| --------------- 1 | 123223 | 2 | 1232ff | --------------- 表B: ------------------ ID | KEY | VALUE | ------------------ 23 | 1 | 435 | 24 | 1 | 436 | ------------------ 键是对表a的ID的引用。我是否可以以某种

我有这样一个场景:

表A:

---------------
ID| SOME_VALUE|
---------------
1 | 123223    |
2 | 1232ff    |
---------------
表B:

------------------
ID | KEY | VALUE |
------------------
23 | 1   | 435   |
24 | 1   | 436   |
------------------
键是对表a的ID的引用。我是否可以以某种方式连接这些表以获得以下结果:

表C

-------------------------
ID| SOME_VALUE|    |    |
-------------------------
1 | 123223    |435 |436 |
2 | 1232ff    |    |    |
-------------------------
根据在表B中找到的匹配值的数量,表C应该能够有任意给定数量的列

我希望这足以解释我在这里想要什么

谢谢。

要做到这一点,您需要使用动态子句

编辑:

好的,我已经做了一些尝试,并基于以下示例数据:

Create Table TableA
(
IDCol int,
SomeValue varchar(50)
)
Create Table TableB
(
IDCol int,
KEYCol int,
Value varchar(50)
)

Insert into TableA
Values (1, '123223')
Insert Into TableA
Values (2,'1232ff')
Insert into TableA
Values (3, '222222')

Insert Into TableB
Values( 23, 1, 435)
Insert Into TableB
Values( 24, 1, 436)

Insert Into TableB
Values( 25, 3, 45)
Insert Into TableB
Values( 26, 3, 46)

Insert Into TableB
Values( 27, 3, 435)
Insert Into TableB
Values( 28, 3, 437)
您可以执行以下动态SQL

declare @sql varchar(max)
declare @pivot_list varchar(max)
declare @pivot_select varchar(max)

Select 
        @pivot_list = Coalesce(@Pivot_List + ', ','') + '[' + Value +']',
        @Pivot_select = Coalesce(@pivot_Select, ', ','') +'IsNull([' + Value +'],'''') as [' + Value + '],'
From 
(
Select distinct Value From dbo.TableB 
)PivotCodes

Set @Sql = '
;With p as (

Select a.IdCol,
        a.SomeValue,
        b.Value
From dbo.TableA a
Left Join dbo.TableB b on a.IdCol = b.KeyCol
)
Select IdCol, SomeValue ' + Left(@pivot_select, Len(@Pivot_Select)-1) + '
From p
Pivot ( Max(Value) for Value in (' + @pivot_list + '
        )
    )as pvt
'

exec (@sql)
这将为您提供以下输出:

尽管这在目前起作用,但要维持下去将是一场噩梦。我建议尝试在其他地方实现这些结果。i、 不在SQL中


祝你好运

这似乎是数据库不应该做的事情。首先;根据要存储的内容,表不能有任意数量的列。因此,无论如何,您都必须设置最大数量的值。您可以通过使用逗号分隔的值作为该单元格的值(或类似pivot的解决方案)来解决这个问题

但是,;如果你有表A和表B;我建议保持这两张桌子;因为他们看起来很正常。如果您需要一个给定输入a.some_值的b.value列表,下面的sql查询将给出该列表

从a,b中选择b.value,其中b.key=a.id a.some_value='INPUT_value'

如前所述,使用动态轴可以获得多个列

我有一个解决方案,可以满足您的需要,只是它将所有的值放在一个VARCHAR列中。如果你可以分割这些结果,那么你就可以得到你需要的

此方法是SQLServer2005中的一个技巧,您可以使用它从一列值中形成一个字符串

CREATE TABLE #TableA (
   ID INT,
   SomeValue VARCHAR(50)
);
CREATE TABLE #TableB (
   ID INT,
   TableAKEY INT,
   BValue VARCHAR(50)
);

INSERT INTO #TableA VALUES (1, '123223');
INSERT INTO #TableA VALUES (2, '1232ff');
INSERT INTO #TableA VALUES (3, '222222');

INSERT INTO #TableB VALUES (23, 1, 435);
INSERT INTO #TableB VALUES (24, 1, 436);
INSERT INTO #TableB VALUES (25, 3,  45);
INSERT INTO #TableB VALUES (26, 3,  46);
INSERT INTO #TableB VALUES (27, 3, 435);
INSERT INTO #TableB VALUES (28, 3, 437);

SELECT
   a.ID
   ,a.SomeValue
   ,RTRIM(bvals.BValues) AS ValueList
FROM #TableA AS a
OUTER APPLY (
   -- This has the effect of concatenating all of
   -- the BValues for the given value of a.ID.
   SELECT b.BValue + ' ' AS [text()]
   FROM #TableB AS b
   WHERE a.ID = b.TableAKEY
   ORDER BY b.ID
   FOR XML PATH('')
) AS bvals (BValues)
ORDER BY a.ID
;
您将得到以下结果:

ID  SomeValue  ValueList
--- ---------- --------------
1   123223     435 436
2   1232ff     NULL
3   222222     45 46 435 437

我个人会改变你的设计。键值表是一个非常困难的设计,很难高效、正确地工作。如果您确实需要键值对,那么关系数据库可能不是存储它们的最佳位置。noSQL数据库可能是一个更好的选择。是的,我知道这不是解决这个问题的好方法,但我只需要一次,它不会在任何应用程序中实现。事实上,我最终选择了你的解决方案,但接受的答案更接近我的原始问题。谢谢没关系。我已经建立了公认答案中的解决方案,正如作者所说,它是有效的,但这是一个维护噩梦。谢谢!我同意“不在SQL中”的观点,但这只是一次而已。