在一个SELECT UNION列

问题描述 投票:0回答:3

比方说:

SELECT Item.Id, Item.ParentId FROM Item ..." 

返回我这样的数据:

Id |  ParentId
----------------
1  | NULL
2  | 17
3  | 13

有没有一种方法,通过使用某种UNION的,但是,从列只有一个SELECT得到这个数据作为一个列?就像是:

SELECT (Item.Id UNION Item.ParentId) AS Id FROM Item...

结果:

Id |
----
1  | 
2  |
3  |
NULL
17 |
13 |

编辑示例:

我有媒体表:

Id |  ParentId
----------------
1  | NULL
2  | 1
3  | 2

它有自身的关系,这是某种形式的3级树状结构(系列 - >四季 - >情节)

还有包含有关可用性信息的另一个表发售:

Id |  MediaId  | Availability
------------------------------
1  | 3         | true

我需要得到所有可用的媒体的ID,也是所有家长的id各级,。

我在想:

SELECT Media.Id, MediaSeason.Id, MediaSeries.Id  FROM Media
LEFT JOIN Media AS MediaSeason ON MediaSeason.Id = Media.ParentId
LEFT JOIN Media AS MediaSeries ON MediaSeries.Id = MediaSeason.ParentId 
LEFT JOIN Offer ON Offer.MediaId = Media.Id
WHERE Offer.Availability = true

这给了我所有的ID我的需要,但在三个不同的列,我试图找到一种方法,把它变成一个,没有重复的加盟,其中登录在3点不同进行选择。

我使用的是MSSQL。

sql sql-server
3个回答
2
投票

如果您的孩子和家长都在同一个表(项目)

SELECT Id FROM Item

将检索的所有项目,包括父母,因为父母也是项目。

但是,如果你想要的是不重复的where子句和IDS有任何匹配的媒体及其相关的父母(即使父媒体不where子句匹配),你可以试试这个:

SELECT 
    m.Id
FROM
    Media m INNER JOIN (
        SELECT 
            m2.Id, m2.ParentId
        FROM 
            Media m2
            LEFT JOIN Offer ON Offer.MediaId = m2.Id
        WHERE 
            Offer.Availability = true
    ) tmp ON (tmp.Id = m.Id OR tmp.ParentId = m.Id)

最后,三个层次:

SELECT 
    m.Id
FROM
    Media m INNER JOIN (
        SELECT 
            m2.Id, m2.ParentId, m3.ParentId AS GrandParentId
        FROM 
            Media m2
            LEFT JOIN Media m3 ON m2.ParentId = m3.Id
            LEFT JOIN Offer ON Offer.MediaId = m2.Id
        WHERE 
            Offer.Availability = true
    ) tmp ON (tmp.Id = m.Id OR tmp.ParentId = m.Id OR tmp.GrandParentId = m.Id)

3
投票

尝试这个:

 SELECT * FROM (SELECT Item.Id FROM Item ...
    UNION ALL
    SELECT Item.ParentId FROM Item ...)

0
投票
SELECT DISTINCT
    pivot_hierarchy.media_id
FROM
    offers  o
LEFT JOIN
    media   m1
        ON m1.id = o.media_id
LEFT JOIN
    media   m2
        ON m2.id = m1.parent_id
OUTER APPLY
(
    SELECT o.media_id
    UNION ALL
    SELECT m1.parent_id WHERE m1.parent_id IS NOT NULL
    UNION ALL
    SELECT m2.parent_id WHERE m2.parent_id IS NOT NULL
)
    AS pivot_hierarchy
WHERE
    o.availability = 'true'

一切行动APPLY应该是不言而喻的。获得报价,得到的是媒体的母公司(如果有),以及媒体的母公司(如果有)。

该应用,然后加入到可返回每个多行函数每一行。在这种情况下,函数返回1,2或3行。那些被媒体ID,它的父(如果有),以及雄伟的父母,如果它有一个。要做到这一点,该函数工会的三个输入列,前提是他们不为空。

这避免了重新加入回向媒体表。

此外,您还需要选择一个独特的。否则,同一系列或季节ID可以返回多次。

© www.soinside.com 2019 - 2024. All rights reserved.