Ошибка: SubQuery вернул более одного значения - PullRequest
0 голосов
/ 23 июля 2010

У меня есть следующий фрагмент кода SQL, который выдает мне ошибку:

WHERE

        (SELECT Tokens FROM StringSplitter(@DocumentValue, '|', 1)) IN
        (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1))

Где @DocumentValue и @sortValue - это сцепленные строки, разделенные разделителем (в данном случае, '|').

Функция StringSplitter возвращает таблицу каждой отдельной строки. например Fox | Brown | SQL возвращает таблицу с тремя записями: Fox, Brown и SQL.

То, что я хочу, чтобы произошло , - это сравнение двух наборов строк, вставка их в другую таблицу (следовательно, ГДЕ), если какая-либо из отдельных строк из @DocumentValue соответствует какой-либо из отдельных строк из @ sortValue.

Эта реализация имеет недостатки. Если @DocumentValue и @sortValue когда-либо содержат более одной совпадающей строки, запрос завершается неудачно с данной ошибкой.

Тем не менее, как я могу исправить эту ошибку, учитывая, что мне все равно, , какое значение соответствует, если я знаю, действительно ли , по крайней мере, один?

Sql Server 2008

Ответы [ 6 ]

3 голосов
/ 23 июля 2010

Попробуйте заменить INTERSECT на IN.Может быть, что-то вроде:

declare @tokenTable table (token nvarchar(50) primary key)
insert into @tokenTable (select ...) INTERSECT (select ...)

Редактировать: Не сразу уверен, что я облажался с этим.Однако работает следующее (обратите внимание, что я использовал таблицы для @documentValue и @sortValue, потому что у меня нет вашей функции сплиттера):

declare @documentValue table(token nvarchar(50) primary key)
declare @sortValue table(token nvarchar(50) primary key)
declare @result table(token nvarchar(50) primary key)

insert into @documentValue (token) values ('A')
insert into @documentValue (token) values ('B')
insert into @documentValue (token) values ('C')
insert into @sortValue select * from @documentValue
delete from @sortValue where token = 'C'


insert into @result 
    select 
        A.* 
    from 
        @documentValue A
    inner join 
        @sortValue B 
    on 
        A.token = B.token
select * from @result
2 голосов
/ 23 июля 2010
<your action here>
WHERE EXISTS (SELECT 1 FROM dbo.StringSplitter(@DocumentValue, '|', 1)  AS a
                       JOIN dbo.StringSplitter(@sortValue, '|', 1)  AS b
                       ON a.Tokens = b.Tokens)
1 голос
/ 23 июля 2010

Вам просто не хватает WHERE Я думаю (или получил его не в том месте)

INSERT INTO YourTable
SELECT Tokens FROM StringSplitter(@DocumentValue, '|', 1)
WHERE Tokens IN (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1))

Хотя ответ @ целесообразный INTERSECT тоже должен работать нормально

INSERT INTO YourTable
SELECT Tokens FROM StringSplitter(@DocumentValue, '|', 1)
INTERSECT
SELECT Tokens FROM StringSplitter(@sortValue, '|', 1)
0 голосов
/ 23 июля 2010

Почему бы не положить свои токены в 2 временные таблицы

(SELECT Tokens INTO #DocTokens FROM StringSplitter(@DocumentValue, '|', 1)) IN 
(SELECT Tokens INTO #SortTokens FROM StringSplitter(@sortValue, '|', 1)) 

SELECT d.Tokens INTO #Tokens FROM #DocTokens d JOIN #SortTokens s ON s.Tokens = d.Tokens

Это даст вам только совпадения. Затем вы можете присоединиться к вашему запросу к #Tokens, чтобы отфильтровать ваш основной выбор.

0 голосов
/ 23 июля 2010
insert into yourNewTableGoesHere(Token)
select a.Tokens 
from StringSplitter(@DocumentValue, '|', 1) a
where exists (select Tokens 
                from StringSplitter(@sortValue, '|', 1) 
                where Tokens = a.Tokens)
0 голосов
/ 23 июля 2010

ПРИСОЕДИНЯЙТЕСЬ?

 (SELECT count(*)
  FROM StringSplitter(@DocumentValue, '|', 1) AS one JOIN
       StringSplitter(@sortValue, '|', 1) AS two ON one.Tokens = two.Tokens
 ) > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...