SQL - объединение таблиц, где один из столбцов является списком - PullRequest
2 голосов
/ 22 сентября 2010

Я пытаюсь объединить два стола.Проблема, с которой я столкнулся, состоит в том, что один из столбцов, к которым я пытаюсь присоединиться, представляет собой список.

Так что возможно объединить две таблицы, используя «IN», а не «=».По линии

SELECT ID  
FROM tableA INNER JOIN  
tableB ON tableB.misc IN tableA.misc  
WHERE tableB.miscTitle = 'help me please'  


tableB.misc = 1  
tableA.misc = 1,2,3  

Заранее спасибо

Ответы [ 4 ]

5 голосов
/ 22 сентября 2010

Нет, то, что вы хотите, невозможно без серьезного обходного пути. НЕ ХРАНИТЕ ИЗДЕЛИЯ, К КОТОРЫМ ВЫ ХОТИТЕ ПРИСОЕДИНИТЬСЯ В СПИСКЕ! Фактически, список с разделителями-запятыми почти никогда не должен храниться в базе данных. Это допустимо только в том случае, если это информация о типе заметки, которая никогда не понадобится использовать в запросе, где встречаются или объединяются.

Если вы застряли в этом ужасном замысле, вам придется проанализировать список во временной таблице или табличной переменной, а затем присоединиться к ней.

1 голос
/ 22 сентября 2010

Функция синтаксического анализа строки, подобная найденной здесь вместе с CROSS APPLY, должна помочь.

CREATE FUNCTION [dbo].[fnParseStringTSQL] (@string NVARCHAR(MAX),@separator NCHAR(1))
RETURNS @parsedString TABLE (string NVARCHAR(MAX))
AS 
BEGIN
   DECLARE @position int
   SET @position = 1
   SET @string = @string + @separator
   WHILE charindex(@separator,@string,@position) <> 0
      BEGIN
         INSERT into @parsedString
         SELECT substring(@string, @position, charindex(@separator,@string,@position) - @position)
         SET @position = charindex(@separator,@string,@position) + 1
      END
     RETURN
END
go

declare @tableA table (
    id int,
    misc char(1)
)

declare @tableB table (
    misc varchar(10),
    miscTitle varchar(20)
)

insert into @tableA
    (id, misc)
    values
    (1, '1')

insert into @tableB
    (misc, miscTitle)
    values
    ('1,2,3','help me please')

select id
    from @tableB b
        cross apply dbo.fnParseStringTSQL(b.misc,',') p
        inner join @tableA a
            on a.misc = p.string
    where b.miscTitle = 'help me please'

drop function dbo.fnParseStringTSQL
1 голос
/ 22 сентября 2010

Попробуйте это:

SELECT ID  
FROM tableA INNER JOIN  
tableB ON ',' + TableA.misc + ',' like '%,' + cast(tableB.misc as varchar) + ',%'
WHERE tableB.miscTitle = 'help me please'  
0 голосов
/ 22 сентября 2010

Идентификатор также находится в таблице B?Если это так, вы можете повернуть таблицы и запустить IN в обратном направлении в разделе WHERE, например:

SELECT ID
FROM tableB
WHERE tableB.miscTitle = 'help me please'
    AND tableB.misc IN (SELECT tableA.misc FROM tableA)

Если это не так, вы можете использовать перекрестное соединение, чтобы получить все комбинации строк междутаблиц, затем удалите строки, которые не подчиняются IN.ВНИМАНИЕ: Это станет огромным объединением, если столы большие.Пример:

SELECT ID
FROM tableA
CROSS JOIN tableB
WHERE tableB.miscTitle = 'help me please'
    AND tableB.misc IN tableA.misc

РЕДАКТИРОВАТЬ: не понял, "в списке" означает VARCHAR с разделителями-запятыми.IN SQL не будет работать для этого, и вы никогда не должны хранить объединяемые данные таким образом в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...