SQL:拆分结果

时间:2017-10-06 12:38:17

标签: mysql sql

我需要从以下输出中获取并在第二个查询中的'IN'语句中使用它

SELECT
MPFlist
FROM My_Table_01
WHERE Reference = <Variable>

返回MPFlist的值(例如) 注意,此列表可能返回可变数量的MPF代码

'LCADL','LCECC','LCHBK','LCHIN'

我的一个问题是我对相关的MS SQL DB进行了只读访问。

我需要做的是以某种方式拆分此输出,以便可以在另一个查询中使用

换句话说,我想要这个

SELECT 
Product,
Company,
Circuit
From My_Table_02  
WHERE MPFID IN
(
SELECT
MPFlist
FROM My_Table_01
WHERE Reference = <Variable>
)

以此身份运行

SELECT 
Product,
Company,
Circuit
From My_Table_02  
WHERE MPFID IN
(
'LCADL','LCECC','LCHBK','LCHIN'
)

任何建议的TIA

3 个答案:

答案 0 :(得分:0)

您可以尝试使用内部联接

SELECT 
  Product, 
  Company, 
  Circuit 
FROM 
  My_Table_02 T2 
  INNER JOIN My_Table_01 T1
    ON T2.MPFID = T1.MPFID

答案 1 :(得分:0)

这是我正在反对的MS SQL DB。

澄清

如果我运行此查询

SELECT 
Product,
Company,
Circuit
From My_Table_02  
WHERE MPFID IN
(
SELECT
MPFlist
FROM My_Table_01
WHERE Reference = <Variable>
)

我没有结果。

这是因为我从此查询中返回了一个值(这是预期的结果)

SELECT
MPFlist
FROM My_Table_01
WHERE Reference = <Variable>

该单个值(作为示例)

'LCADL','LCECC','LCHBK','LCHIN'

而不是(如本例中)4个值,例如

LCADL
LCECC
LCHBK
LCHIN

通常会在子查询中自动处理。

这也是我不能使用内连接的原因,因为在一个表中每个字段是单个代码(例如LCADL),而在第二个表中,字段值是(例如)'LCADL','LCECC', 'LCHBK', 'LCHIN'

只读访问的相关性是我到目前为止看到的解决方案取决于能够创建临时表,我不能这样做。

答案 2 :(得分:0)

好的,我认为我找到了可以解决问题的方法。

改编自https://stackoverflow.com/a/19837110/8732261

DECLARE @id_list VARCHAR(MAX) = 
(
SELECT
REPLACE(MPFlist,'''','')
FROM My_Table_01
WHERE Reference = <Variable>
)
DECLARE @table TABLE ( id VARCHAR(50) )
DECLARE @x INT = 0
DECLARE @firstcomma INT = 0
DECLARE @nextcomma INT = 0

SET @x = LEN(@id_list) - LEN(REPLACE(@id_list, ',', '')) + 1 -- number of ids in id_list

WHILE @x > 0
    BEGIN
        SET @nextcomma = CASE WHEN CHARINDEX(',', @id_list, @firstcomma + 1) = 0
                              THEN LEN(@id_list) + 1
                              ELSE CHARINDEX(',', @id_list, @firstcomma + 1)
                         END
            INSERT  INTO @table
            VALUES  ( SUBSTRING(@id_list, @firstcomma + 1, (@nextcomma - @firstcomma) - 1) )
            SET @firstcomma = CHARINDEX(',', @id_list, @firstcomma + 1)
            SET @x = @x - 1
        END

SELECT 
Product,
Company,
Circuit
From My_Table_02  
WHERE MPFID IN
(
SELECT *
FROM @Table
)