比方说:
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。
如果您的孩子和家长都在同一个表(项目)
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)
尝试这个:
SELECT * FROM (SELECT Item.Id FROM Item ...
UNION ALL
SELECT Item.ParentId FROM Item ...)
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可以返回多次。