Вы регистрируетесь как доверенный пользователь (по умолчанию) - и этот пользователь является пользователем пула IIS APPPOOL \ DefaultAppPool, вам нужно либо войти в систему, либо вы в качестве логина SQL. Поскольку он не использует одни и те же учетные данные при запуске под пулом, как это делается с вашего рабочего стола.
Sergio Дель Амо:
Однако я не получаю страницы без тегов. Я предполагаю, что должен записать свой запрос с левыми внешними объединениями.
SELECT pagetag.id, page.name, group_concat(tag.name)
FROM
(
page LEFT JOIN pagetag ON page.id = pagetag.pageid
)
LEFT JOIN tag ON pagetag.tagid = tag.id
GROUP BY page.id;
Не очень симпатичный запрос, но должен дать Вам, что Вы хотите - pagetag.id
и group_concat(tag.name)
будет null
для страницы 4 в примере Вы отправили выше, но страница должна появиться в результатах.
Да, можно сделать это через 3 что-то как ниже:
SELECT page_tag.id, page.name, group_concat(tags.name)
FROM tag, page, page_tag
WHERE page_tag.page_id = page.page_id AND page_tag.tag_id = tag.id;
Не был протестирован, и мог быть, вероятно, быть записанным немного более эффективно, но должны запустить Вас!
Кроме того, MySQL принят, так может не играть настолько любезный с MSSQL! И MySQL не дик о дефисах в именах полей, так изменивших на символы нижнего подчеркивания в вышеупомянутых примерах.
Насколько я - осведомленный SQL92, не определяет, как конкатенация строк должна быть сделана. Это означает, что большинство механизмов имеет свой собственный метод.
Если Вы хотите базу данных независимый метод, необходимо будет сделать это за пределами базы данных.
(непротестированный во всех кроме Oracle)
Oracle
SELECT field1 | ', ' | field2
FROM table;
MS SQL
SELECT field1 + ', ' + field2
FROM table;
MySQL
SELECT concat(field1,', ',field2)
FROM table;
PostgeSQL
SELECT field1 || ', ' || field2
FROM table;
Я получил решение, играющее с соединениями. Запрос:
SELECT
page.id AS id,
page.name AS name,
tagstable.tags AS tags
FROM page
LEFT OUTER JOIN
(
SELECT pagetag.pageid, GROUP_CONCAT(distinct tag.name) AS tags
FROM tag INNER JOIN pagetag ON tagid = tag.id
GROUP BY pagetag.pageid
)
AS tagstable ON tagstable.pageid = page.id
GROUP BY page.id
И это будет выводом:
id name tags
---------------------------
1 page 1 tag2,tag3,tag1
2 page 2 tag1,tag3
3 page 3 tag4
4 page 4 NULL
Действительно ли возможно повысить скорость запроса, пишущий это иначе?
Я думаю, что Вы, возможно, должны использовать несколько обновлений.
Что-то как (не протестированный):
select ID as 'PageId', Name as 'PageName', null as 'Tags'
into #temp
from [PageTable]
declare @lastOp int
set @lastOp = 1
while @lastOp > 0
begin
update p
set p.tags = isnull(tags + ', ', '' ) + t.[Tagid]
from #temp p
inner join [TagTable] t
on p.[PageId] = t.[PageId]
where p.tags not like '%' + t.[Tagid] + '%'
set @lastOp == @@rowcount
end
select * from #temp
Ужасный все же.
T-SQL того примера, но я думаю, что MySql имеет эквиваленты всему используемому.
pagetag.id и group_concat (tag.name) будут пустыми для страницы 4 в примере, который Вы отправили выше, но страница должна появиться в результатах.
Можно использовать COALESCE
функция для удаления Пустых указателей, если Вы должны:
select COALESCE(pagetag.id, '') AS id ...
Это возвратит первое ненулевое значение из, он - список параметров.