2012-04-04 2 views
12

Я надеюсь, что это не повторение. Я проверил поиски, и я не могу найти четкого ответа на этот вопрос.Присоединяйтесь к таблицам 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 ON значение StateID в URL-адрес URL-адреса. Я действительно не понял, как присоединиться. Я даже попробовал просто выбрать одну таблицу и попытался отфильтровать значения в StateTable. Я пытался сделать что-то вроде этого:

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

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

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

спасибо !!

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

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

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

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

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

ответ

17

Включить StateID в comp приемлемый тип, например.

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

или

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

, если URL является NVARCHAR (...)

EDIT

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

5

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

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

EDIT

В рамках комментария вы также можете так с JOIN. Как это:

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

+1 и я думаю, что вы могли бы использовать этот синтаксис в соединении – Paparazzi

+0

Обновлен ответ – Arion

+0

Будет ли это работать, если я должен что-то использовать, зная, что Я ищу, всегда будет следовать строке «ID =», и всегда будут следующие 36 символов? Может быть, что-то вроде CAST (SUBSTRING (URL, CHARINDEX ('ID =', URL) +1,36) AS UNIQUEIDENTIFIER) = StateID и что такое производительность по этому поводу? – divamatrix

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

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

+0

Спасибо за предложение на дополнительной таблице. На самом деле, я думаю, что это отличная идея и определенно будет работать, не вмешиваясь в существующую структуру. Теперь .. Я буду честным и скажу, что я не администратор базы данных. Любые советы по наилучшему способу построения и поддержания этого стола? Зная, что база данных видит так много трафика, она часто размещается на собственном сервере БД, я бы, вероятно, посмотрел на добавление таблицы на сайт db, а не в db аналитики. – divamatrix

+0

Лучше, если новая таблица находится в одном и том же БД или, по крайней мере, на том же сервере, бит больше работает, если нет. Большой вопрос для таблицы - это схема, вы можете получить более одного регистратора для одного и того же гида. –

+0

На самом деле, немного больше исследований говорит мне, что я определенно хочу, чтобы таблица была в том же дБ. Так что это предполагается. Чтобы ответить на ваш другой вопрос, абсолютно.таблица состояний, например, представляет собой таблицу, содержащую идентификаторы для определенных типов посетителей. Таблица URL - это сложная таблица, которая в основном рассматривает идентификатор URL и идентификатор сеанса для каждого запроса, и если он не найдет запись, которая точно соответствует как сеансу, так и URL-адресу, он создаст новую запись. Я ищу уникальные базовые URL-адреса, которые вы посещали для каждого идентификатора типа пользователя, просматривая запросы, которые содержат их идентификатор – divamatrix

0

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

Смежные вопросы