SQL Добавление строки в возвращенную строку - PullRequest
0 голосов
/ 20 июня 2009

Хорошо,

У меня есть публикация таблицы, в которой есть PublicationID, PublisherID, NameAbbrev ... и она соединена с другой таблицей с именем AreaBuy, в которой есть поля AreaBuyID, NameAbbrev, DateCreated и CreatedBy. В основном это связано с тем, что компания подписала группу документов (не обязательно принадлежащих одной и той же головной компании) для наших продуктов. Таблицы публикации и AreaBuy являются соединением через таблицу PublicationAreaBuy, которая имеет отношение 1 ... M ... 1 (правильные имена правильно!).

Мой вопрос: я хочу выбрать набор публикаций из таблицы публикаций, скажем, мы подписали их в период с 1-го дня этого года до настоящего времени, но если какой-либо из этих возвращенных документов находится в группе AreaBuy, Я хочу, чтобы это также вернулось! Главное, я хочу вернуть только два столбца, это будут все идентификаторы публикации и имена, поэтому я хочу, чтобы информация AreaBuy была включена в эти два столбца. Допустим, я получил пять результатов в моем наборе:

idNum | name
1       The Herald
2       L A Times  
162     L A Area Buy
230     County Enquirer
2006    Illinois Post 

Итак, Лос-Анджелес таймс находится в LA Area Buy, так что это также видно - как ты это делаешь? Включить один набор информации о результатах в другой?

Извините, это дерьмовое объяснение, Р.

Ответы [ 3 ]

0 голосов
/ 20 июня 2009

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

SELECT P.PublicationID, P.Name
From Publication P
LEFT JOIN PublicationAreaBuy AS PAB
ON P.PublicationID = PAB.PublicationID
LEFT JOIN AreaBuy AS AB 
ON PAB.AreaBuyID = AB.AreaBuyID
WHERE P.SignedUp > @firstDayOfYear
OR Not AB.AreaBuyID is NULL

При этом будут возвращены PublicationID и имя публикации для всех публикаций, подписанных после первого дня года, или если они находятся в таблице PublicationAreaBuy.

0 голосов
/ 20 июня 2009

Это фактически сводная точка, но ее проще всего представить как UNION из двух различных наборов - набора публикаций и набора областей, с которыми они связаны. Обычный UNION устраняет дублирование наборов, поэтому обычно немного медленнее. UNION ALL, вероятно, создаст несколько областей, если две публикации находятся в одной области, поэтому вам потребуется DISTINCT, чтобы остановить там дубликаты, если вы используете UNION ALL:

SELECT 'Publication' AS RowType
    ,Publication.PublicationID AS idNum
    ,Publication.NameAbbrev AS name
FROM Publication
WHERE Publication.SignedUp >= '1/1/2009'

UNION ALL

SELECT DISTINCT 'Area' AS RowType
    ,AreaBuy.AreaBuyID AS idNum
    ,AreaBuy.NameAbbrev AS name
FROM AreaBuy
INNER JOIN PublicationAreaBuy
    ON AreaBuy.AreaBuyID = PublicationAreaBuy.AreaBuyID
INNER JOIN Publication
    ON PublicationAreaBuy.PublicationID = Publication.PublicationID
WHERE Publication.SignedUp >= '1/1/2009'

или используя UNION:

SELECT 'Publication' AS RowType
    ,Publication.PublicationID AS idNum
    ,Publication.NameAbbrev AS name
FROM Publication
WHERE Publication.SignedUp >= '1/1/2009'

UNION

SELECT 'Area' AS RowType
    ,AreaBuy.AreaBuyID AS idNum
    ,AreaBuy.NameAbbrev AS name
FROM AreaBuy
INNER JOIN PublicationAreaBuy
    ON AreaBuy.AreaBuyID = PublicationAreaBuy.AreaBuyID
INNER JOIN Publication
    ON PublicationAreaBuy.PublicationID = Publication.PublicationID
WHERE Publication.SignedUp >= '1/1/2009'

На диалекте SQL, поддерживающем общие табличные выражения, вы можете избежать дублирования более сложной бизнес-логики, выполнив следующее:

WITH SelectedPubs AS (
    SELECT Publication.PublicationID
        ,Publication.NameAbbrev
    FROM Publication
    WHERE Publication.SignedUp >= '1/1/2009'
)
SELECT 'Publication' AS RowType
        , SelectedPubs.PublicationID AS idNum
        ,SelectedPubs.NameAbbrev AS name
FROM SelectedPubs

UNION

SELECT 'Area' AS RowType
    ,AreaBuy.AreaBuyID AS idNum
    ,AreaBuy.NameAbbrev AS name
FROM AreaBuy
INNER JOIN PublicationAreaBuy
    ON AreaBuy.AreaBuyID = PublicationAreaBuy.AreaBuyID
INNER JOIN SelectedPubs
    ON PublicationAreaBuy.PublicationID = SelectedPubs.PublicationID
0 голосов
/ 20 июня 2009

ОК, я думаю, что следую за тем, что вам нужно. Я думаю, что-то подобное должно сработать.

SELECT Publication.PublicationID, Publication.NameAbbrev
FROM Publication
UNION ALL
SELECT AreaBuy.AreaBuyID, AreaBuy.NameAbbrev
FROM AreaBuy
INNER JOIN PublicationAreaBuy
ON AreaBuy.AreaBuyID = PublicationAreaBuy.AreaBuyID
INNER JOIN Publication
ON PublicationAreaBuy.PublicationID = Publication.PublicationID    

При необходимости добавьте хуки для DateCreated или любого другого дискриминанта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...