Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将行添加到返回行中的SQL_Sql - Fatal编程技术网

将行添加到返回行中的SQL

将行添加到返回行中的SQL,sql,Sql,嗯 我有一个表发布,它有PublicationID、PublisherID、NameAbbrev。。。这被连接到另一个名为AreaBuy的表,该表有一个AreaBuyID字段NameAbbrev、DateCreated和CreatedBy字段。这种关系基本上是公司为我们的产品签署了一组文件,这些文件不一定属于同一个伞型公司。publication和AreaBuy表是通过PublicationAreaBuy表连接的,该表具有1…M…1关系,对吧 我的问题是:我想从publication表中选择一组

我有一个表发布,它有PublicationID、PublisherID、NameAbbrev。。。这被连接到另一个名为AreaBuy的表,该表有一个AreaBuyID字段NameAbbrev、DateCreated和CreatedBy字段。这种关系基本上是公司为我们的产品签署了一组文件,这些文件不一定属于同一个伞型公司。publication和AreaBuy表是通过PublicationAreaBuy表连接的,该表具有1…M…1关系,对吧

我的问题是:我想从publication表中选择一组出版物,假设我们在今年的第一天到现在之间注册了这些出版物,但是如果返回的任何论文属于AreaBuy组,我也希望返回!关键是,我只想返回两列,这将是所有出版物id和名称,因此我希望AreaBuy信息包含在这两列中。假设我在我的集合中得到五个结果:

idNum | name 1 The Herald 2 L A Times 162 L A Area Buy 230 County Enquirer 2006 Illinois Post 所以,《洛杉矶时报》是在洛杉矶地区购买的,所以它也出现了——你是怎么做到的?将一组结果信息合并到另一组中


对不起,这是一个蹩脚的解释,R.

好的,我想我明白你的意思了。我认为像这样的事情应该会奏效

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或任何其他判别式的挂钩。

很难说,解释不是很清楚,但您肯定希望使用联接。从阅读你的问题,这是我能得到的最接近我认为你想要的

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表中。

这实际上是一个轴心,但最容易表示为两个不同集的联合—出版物集和它们链接到的区域集。正常的并集会对集合进行重复数据消除,因此通常会稍微慢一点。如果两个出版物位于同一区域,则UNION ALL可能会生成多个区域,因此,如果使用UNION ALL,则需要使用DISTINCT来停止重复:

或使用UNION:

在支持公共表表达式的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

您的“出版物”表是否有“创建日期”字段或类似字段?是的,有,称为“创建日期-创意”!对这个问题的看法很有趣。但是,当返回时,您如何知道第一列中是否有publicationID或AreaBuyID?名称列也是如此。如何知道您是否拥有某个区域或出版物的名称?如果需要此信息,您可以添加第三列,或者在第一列的值后面添加publication或Buy。如果需要这些信息,将两个单独的查询联合在一起可以让您轻松地执行此操作。如果我希望从Publication和AreaBuy获得不同数量的列,有什么方法可以做到这一点?我需要出版物中的8列和AreaBuy中的两列,但每个表中的列数必须匹配。谢谢。这清楚地表明,将两组不同类型的数据联合起来可能没有真正意义。但是,如果您仍然想这样做,只需向查询的Area部分添加一些NULL列即可。如果合并上述内容,我的结果集已从471增加到2129。这是原始查询。选择dbo.Publication.PublicationID、dbo.Publication.NameAbbrev、dbo.Publication.TestingStage、dbo.Publication.PublisherID、dbo.Publication.CountryCodes、dbo.Business.City、dbo.Business.State、dbo.Publication.Type、,dbo.Publication.LastCoverPageLink来自dbo.Publication LEFT外部连接dbo.Business ON dbo.Publication.PublicationID=dbo.Business.BusinessID其中dbo.Publication.HasTearSheets=1 ORDER BY dbo.Publication.NameAbbrev我应该如何合并上述内容,新查询太长,无法作为注释添加,呃。好,我意识到了问题所在,WHERE Publication_1.HasTearSheets=1没有被合并。如何将“where”子句合并到查询中?
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'
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