Подтвердить что ты не робот

Присоединяйте таблицы SQL Server к подобному выражению

Я надеюсь, что это не повторение. Я проверил поиски, и я не могу найти ответ на этот вопрос.

У меня есть таблица, в которой первичный ключ установлен как UniqueIdentifier. У меня также есть другая таблица, в которой есть столбец varchar, который в основном содержит URL-адрес с строкой запроса, содержащей указатели из моей первой таблицы.

Итак, мои 2 таблицы похожи на:

StateTable

StateID                                  StateName
EB06F84C-15B9-4397-98AD-4A63DA2A238E     Active

URLTable

URL
page.aspx?id=EB06F84C-15B9-4397-98AD-4A63DA2A238E

То, что я пытаюсь сделать, - это объединение URLTable и StateTable Вкл. значение StateID содержится в URL-адресе URL-таблицы. Я действительно не понял, как присоединиться. Я даже попробовал просто выбрать одну таблицу и попытался фильтровать значения в StateTable. Я пробовал сделать что-то вроде этого:

SELECT  *
FROM URLTable
WHERE     EXISTS
    (SELECT  *
     FROM  StateTable
     WHERE URL LIKE '%' + StateID + '%')

Даже это не работает, потому что говорит, что я сравниваю UniqueIdentifier и varchar.

Есть ли способ присоединиться к 2 таблицам с помощью подобной команды и где подобная команда не сравнивает 2 несовместимых переменных?

Спасибо!

ОБНОВЛЕНИЕ: Позвольте мне добавить некоторые дополнительные вещи, о которых я должен был упомянуть. Запрос предназначен для создания отчетов аналитики. Таблицы являются частью пакета аналитики CMS... поэтому обновление или изменение структуры таблицы не является вариантом.

Во-вторых, эти таблицы видят очень большой объем трафика, так как они захватывают аналитику сайта... так что производительность очень важна. В-третьих, в моем примере я сказал id =, но может быть несколько значений, таких как id=guid&user=guid&date=date.

ОБНОВЛЕНИЕ 2: Еще одна вещь, которую я только что осознал в своем ужасе, состоит в том, что иногда строка запроса содержит тире, удаленные из GUID.. а иногда и нет.. поэтому, если я не ошибаюсь, я не могу наложить подстроку на UniqueIdentifier. Может кто-нибудь подтвердить? вздох. Я получил его для работы с помощью

REPLACE('-','',CONVERT(varchar(50), a.AutomationStateId))

но теперь меня очень беспокоит проблема с производительностью, так как таблица URL очень большая. Однако это может быть характер зверя, если только я ничего не могу сделать.

4b9b3361

Ответ 1

Включить StateID к совместимому типу, например

WHERE URL LIKE '%' + CONVERT(varchar(50), StateID) + '%'

или

WHERE URL LIKE N'%' + CONVERT(nvarchar(50), StateID) + N'%'

если URL-адрес nvarchar (...)

ИЗМЕНИТЬ

Как указано в другом ответе, это может привести к плохой работе на больших таблицах. LIKE в сочетании с CONVERT приведет к сканированию таблицы. Это может не быть проблемой для небольших таблиц, но вы должны рассмотреть возможность разделения URL на два столбца, если производительность становится проблемой. Один столбец будет содержать "page.aspx? Id =", а другой - UNIQUEIDENTIFIER. Тогда ваш запрос может быть оптимизирован намного легче.

Ответ 2

Знаете ли вы, что = всегда есть и всегда есть UNIQUEIDENTIFIER. Затем вы можете сделать это:

WHERE CAST(SUBSTRING(URL, CHARINDEX('=',URL)+1,LEN(URL)) AS UNIQUEIDENTIFIER)=StateID

ИЗМЕНИТЬ

В качестве части комментария вы также можете использовать его с JOIN. Вот так:

select 
   u.* 
from 
   urltable
join statetable s 
   on CAST(SUBSTRING(URL, CHARINDEX('=',URL)+1,LEN(URL)) AS UNIQUEIDENTIFIER)=StateID

Ответ 3

select u.* from urltable
join statetable s on url like N'%' + (convert(varchar(50),s.stateid) + N'%'

производительность, вероятно, будет ужасной

Ответ 4

Вы можете повысить производительность, если сначала создаете временную таблицу с возможностью индексирования таблицы temp. Затем вы также можете изменить схему (вашей временной таблицы), которая может дать вам варианты вашего соединения. Часто при подключении к BIG-таблицам сначала извлекается подмножество данных в временную таблицу, а затем присоединяется к ней. В других случаях накладные расходы таблицы temp больше, чем использование "уродливого" соединения