Sql 在一个选择中联合列
比如说:Sql 在一个选择中联合列,sql,sql-server,Sql,Sql Server,比如说: SELECT Item.Id, Item.ParentId FROM Item ..." 将以下数据返回给我: Id | ParentId ---------------- 1 | NULL 2 | 17 3 | 13 是否有一种方法可以通过使用某种类型的并集将此数据作为一列获取,但只对来自一个SELECT的列执行此操作?比如: SELECT (Item.Id UNION Item.ParentId) AS Id FROM Item... 结果: Id | ---- 1
SELECT Item.Id, Item.ParentId FROM Item ..."
将以下数据返回给我:
Id | ParentId
----------------
1 | NULL
2 | 17
3 | 13
是否有一种方法可以通过使用某种类型的并集将此数据作为一列获取,但只对来自一个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
它与自身有联系,这是一种三级树结构
系列->季节->剧集
还有另一个包含可用性信息的表格优惠:
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 * FROM (SELECT Item.Id FROM Item ...
UNION ALL
SELECT Item.ParentId FROM Item ...)
如果您的孩子和父母在同一个表项中
SELECT Id FROM Item
将检索所有项,包括父项,因为父项也是项
但是,如果您希望不重复where子句,并且即使父媒体与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)
应用程序之前的所有内容都应该是不言自明的。获取优惠,获取该媒体的父媒体(如果有),以及该媒体的父媒体(如果有)
然后,APPLY将每一行连接到一个函数,该函数可以返回每一行以上。在这种情况下,函数返回1、2或3行。这些是媒体id,如果它有一个,则是它的父代,如果它有一个,则是它的父代。为此,函数将三个输入列合并,前提是它们不为null
这样可以避免再次连接到媒体表
此外,您还需要在select中使用distinct。否则,同一系列或季节id可能会返回多次。我知道我可以使用两个SELECT,问题是我可以在一个中完成吗SELECT@TomaszKaniewski这是正确的方法,如果你不想使用它,你需要清楚地说明原因。虽然不需要外部选择,只需要内部查询联合两个选择。好的,假设我有一个很长的查询,有很多连接和位置。这个查询包含两个colun,我需要在一列中返回id。对于简单的联合,我必须将整个连接和WHERE逻辑复制到两个SELECT,这就是我试图避免的,这就是为什么第一条评论会询问SQL方言。因为这种要求是特定于方言的。@MatBailie在我的例子中,在加入之前进行联合有什么意义?我将有所有的ID和它的重复父ID。你能告诉我你认为如何首先使用UNION吗?你使用的是哪种SQL语言?哪种关系数据库管理系统?MySQL、SQL Server、PostgreSQL、SQLite、Oracle等?它们都有不同的工具来实现这一点。但是,你为什么不把两个选择联合起来呢?你认为他们的媒体有什么不好的地方,你可能错了,或者你在这样做的过程中真的遇到了问题吗?我有一些与自身有关的桌面媒体。这是三级关系,假设数据可以是eposodelVL1、季节lVL2、系列lVL3,所有这些都在一个表中。还有另一个表,我们称之为Offer,它包含关于可用性的信息。报价与媒体表有关。我必须找到所有可用媒体的Id,所有级别的paren't Id都在一列中。我正在考虑在父id上加入3个媒体表,加入offer以检查可用性,然后将其全部放在一列中。请阅读本文,然后用示例更新您的问题:如果该表引用自身,则父id列中的任何值都必须存在于id列中。所以,只需从媒体中选择id就可以提供所有唯一的id…可能会出现这样的情况:在某一集中有优惠,但在家长季或家长系列中没有优惠,但我仍然必须获得这3个id,所以我不能只选择id…是的,但家长可以通过where offer进行筛选。Availability=true。在某些情况下,可能会有人在这一集上出价,但在这一季或这一系列中没有出价,但我仍然必须得到这个3号身份证s@TomaszKaniewski,好的,所以使用UNNEST。我已经编辑了答案以包含它。可能是它,但我正在使用MSSQL。你的意思是MSSQL不支持UNNEST吗?Unnest是标准SQL的一部分。能否请您编辑问题并添加特定版本的SQL server标记给我一个机会,我正在电话上这样做!:
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'