2012-05-11 6 views
3

У меня есть две таблицы, Книги и Авторы, многие-ко-многим между ними через третью таблицу под названием book_authors, я пытаюсь перечислить все книги с авторами для каждой книги, используя внутреннее соединение, чтобы отображать их в элементе управления DataList, но соединение вызывает несколько повторяющихся строк, потому что в каждой книге может быть много авторов, поэтому для каждого автора будет строка.
Пример:Объединение значений столбцов в отношения многие ко многим присоединяется

book_title   author 
b1     a1 
b1     a2 

Что такое лучший способ это исправить, так что становится:

book_title    author 
b1      a1, a2 
+0

Используйте подзапрос и функцию конкатенации строк на вашем db, затем укажите список авторов как единственную строку для отображения. – Gabber

+0

Взгляните на эти сообщения: http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-ms-sql-server-2005, http://stackoverflow.com/questions/ 273238/how-to-use-group-by-to-concatenate-strings-in-sql-server и http://stackoverflow.com/questions/941103/concat-groups-in-sql-server – Marco

ответ

4

Может быть что-то вроде этого:

SELECT 
    Books.book_title, 
    STUFF 
    (
     (
      SELECT 
       ',' +author 
      FROM 
       book_authors 
       JOIN Authors 
        ON book_authors.authorId=Authors.authorId 
      WHERE 
       book_authors.bookId=Books.bookid 
      FOR XML PATH('') 
     ) 
    ,1,1,'') 
FROM 
    Books 

EDIT

It трудно сказать, что вы да та. Имеет ли эта работа:

DECLARE @Table1 TABLE(ID INT) 
DECLARE @Table2 TABLE(Name varchar(100),ID INT) 

INSERT INTO @Table1 VALUES(1),(2) 
INSERT INTO @Table2 VALUES('test1',1),('test2',1),('test3',2),('test4',2) 

SELECT 
    t1.ID, 
    STUFF 
    (
     (
      SELECT 
       ',' +t2.Name 
      FROM 
       @Table2 AS t2 
      WHERE 
       t1.ID=t2.ID 
      FOR XML PATH('') 
     ) 
    ,1,1,'') 
FROM 
    @Table1 AS t1 
+0

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

+0

Большое спасибо, ты спас мне жизнь. мне удалось заставить его работать. –

+0

Нет проблем. Рад помочь: P – Arion

1

Если вы хотите сделать это чисто в SQL, то вы будете нуждаться в суб-запрос, который берет книгу идентификатор и yeilds список авторов (CSV, если тот, как вы хотите) как результат. Используйте этот подзапрос в другом запросе, который для каждой уникальной книги возвращает список book_title и автора.

Если вы не против использования чистого SQL, я бы сказал, что просто перебираем DataList, который вы в данный момент получаете, и создаете структуру типа карты (book_title -> authorList), добавляя авторов при прохождении.

Лучший выбор зависит от того, как вы используете это, но, как правило, я бы сказал, что маршрут sql - это путь.

+0

Это именно то, что я собирался делать, но я не могу понять SQL-запрос, чтобы сделать это. –

+1

Прошу прощения за то, что у меня не было времени написать все, но [ЗДЕСЬ] (http://blog.sqlauthority.com/2009/11/25/sql-server-comma-separated-values-csv-from-table- column /) является ссылкой о том, как взять таблицу и превратить ее в строку csv. Если вы сделаете это в функцию, вы можете использовать его внутри запроса. Просто передайте эту функцию id книги, она вернет строку csv и сделает это для всех книг.Сообщение ниже, написанное Г. Линоффом, может работать, если вы знаете максимальное количество авторов, которые у вас есть. –

1

Что вы хотите сделать, это объединение контуров строк. На эту тему есть очень хорошие посты.

Вот альтернатива, которая может легко работать в вашем случае, поскольку книги не слишком много авторов:

select b.name, 
     (max(case when authornum = 1 then author else '' end) + 
     max(case when authornum = 2 then ', '+ author else '' end) + 
     max(case when authornum = 3 then ', '+ author else '' end) 
     ) as authors 
from (select ba.*, 
       row_number() over (partition by bookid order by authorid) as authornum 
     from BookAuthors ba 
    ) bajoin 
     Authors a 
     on a.authorid = ba.authorid join 
     Books b 
     on b.bookid = ba.bookid 
group by b.name 

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

+0

спасибо, я мог бы попробовать это в будущем, если бы мне это было нужно, вышеупомянутые сообщения работали хорошо пока. –

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