简体   繁体   English

SQL Server中的子查询和存在

[英]SUBQUERY and EXISTS in SQL Server

I am running following query and it returns all columns in resultset from both tblFamily and tblConstituent . 我正在运行以下查询,它从tblFamilytblConstituent返回结果tblFamily所有列。

SELECT
    *
FROM
    tblFamily AS f
WHERE
    DataProviderID = 23
    AND ISNULL(UsesIndexMarker, 0) = 0
    AND EXISTS (SELECT 1
                FROM tblConstituent
                WHERE FamilyID = f.FamilyID
                  AND StartDate < GETDATE()
                  AND EndDate > GETDATE()
                  AND FilterValue LIKE '%-%-%');

Now, I want only selected/few columns in the resultset from tblFamily and tblConstituent as below. 现在,我只希望从tblFamilytblConstituent的结果tblFamily选择/很少列,如下所示。 But when I run I can fetch columns from tblFamily fine but can't fetch any of the columns from tblConstituent . 但是,当我跑我可以获取从列tblFamily罚款,但不能从获取任何列tblConstituent

SELECT
    td.FamilyID, 
    td.Name,
    td.DataProviderID,
    td.UsesIndexMarker,
    td.OpenDate,
    td.ListingID
FROM
    (SELECT *
     FROM tblFamily AS f
     WHERE DataProviderID = 23
       AND ISNULL(UsesIndexMarker, 0) = 0
       AND EXISTS (SELECT 1
                   FROM tblConstituent AS tc
                   WHERE tc.FamilyID = f.FamilyID
                     AND tc.StartDate < GETDATE()
                     AND tc.EndDate > GETDATE()
                     AND tc.FilterValue LIKE '%-%-%'
                     AND f.DataProviderID = 23
                     AND ISNULL(f.UsesIndexMarker, 0) = 0)) AS td;

Any idea why I can't fetch data from tblConstituent while all data is available when I run first query? 知道为什么在我运行第一个查询时所有数据都可用时为什么无法从tblConstituent获取数据吗? I get this error: 我收到此错误:

Msg 207, Level 16, State 1, Line 79 消息207,第16级,州1,第79行
Invalid column name 'ListingID' 无效的列名“ ListingID”

Hope my question is clear. 希望我的问题清楚。

Thank you. 谢谢。

PS: Table Definitions below: PS:下表定义:

tblFamily tblFamily

FamilyID    int
RefFamilyID int
FamilyTypeID    int
Name    varchar
DataProviderID  int
CalendarID  int
TrustedPrices   tinyint
FXRateSetID int
CurrentDate date
LastRevision    bigint
HasClose    tinyint
HasOpen tinyint
HasTPlus    tinyint
OffsetFromMaxAsAtDate   tinyint
PriceSetID  int
DividendSetID   int
CorporateActionSetID    int
IncludeFilterInNaturalKey   tinyint
MatchAllCodes   tinyint
CodeReferenceFamilyID   int
LatestTaskRunID int
TrustedFXRates  tinyint
HasDividends    tinyint
HasPrices   tinyint
HasRebalance    tinyint
HasReferenceData    tinyint
HasIntradayChanges  tinyint
TplusDataIsDelta    tinyint
ValidateAfterPersisting tinyint
LastUpdate  datetime
FundProviderID  int
TimeDataExpires time
ExcludeZeroNumberOfUnits    bit
PrefilterConstituents   bit
LimitEndDate    bit
IgnoreForPricing    bit
ExcludedAssetSetID  int
NextRebalanceDate   date
TaxRateSetID    int
OpenDataIsDelta bit
RebalanceDataIsDelta    bit
OpenDate    date
AutoAddMissingListing   bit
EnforcedSecurityTypeID  int
TplusDataIsCummulative  bit
CalculationSetID    int
ValidationSetID int
UsesIndexMarker bit
MappingReferenceFamilyID    int
DataExtractionSetID int
MappingReferenceSecurityID  int
AutoAddOddLots  bit
DefaultFilterValue  varchar
SecurityClassID int
CountryClassificationID int
DataStatusMask  int
RebalanceFrequency  varchar
RebalanceNotes  varchar
NextRebalanceDataAvailable  date
CheckFileDates  bit
IsPayDateUseForReinvestment int
ValidationThresholdSetID    int
Created datetime

and table tblConstituent 和表tblConstituent

ConstituentID   bigint
FamilyID    int
ListingID   int
StartDate   date
EndDate date
FilterValue varchar
ConstituentType tinyint
NumberOfUnits   decimal
PriceAdjustmentFactor   decimal
Factor1 decimal
Factor2 decimal
Factor3 decimal
Factor4 decimal
Factor5 decimal
Factor6 decimal
Factor7 decimal
Factor8 decimal
Factor9 decimal
IsGettingArchived   tinyint

You are right Zeki Gumus. 您是正确的Zeki Gumus。

But no need join equalevents below 但不需要在下面加入等号事件

    AND f.DataProviderID = 23
    AND ISNULL(f.UsesIndexMarker, 0) = 0

"where" exists them 它们“在哪里”存在

you can't put ListingId to list because you use tblConstituent with EXISTS instead of JOIN. 您不能将ListingId列出,因为您将tblConstituent与EXISTS一起使用,而不是JOIN。 Please check the following query, I believe this is what you want : 请检查以下查询,我相信这是您想要的:

SELECT  F.FamilyID, 
        F.Name,
        F.DataProviderID,
        F.UsesIndexMarker,
        F.OpenDate,
        TC.ListingID
FROM    tblFamily AS f
INNER JOIN tblConstituent AS tc
                   ON tc.FamilyID = f.FamilyID
                     AND tc.StartDate < GETDATE()
                     AND tc.EndDate > GETDATE()
                     AND tc.FilterValue LIKE '%-%-%'
                     AND f.DataProviderID = 23
                     AND ISNULL(f.UsesIndexMarker, 0) = 0

I just noticed we don't need this part. 我只是注意到我们不需要这部分。 Thanks Cagdas. 谢谢卡格达斯。

--WHERE DataProviderID = 23
--AND       ISNULL(F.UsesIndexMarker, 0) = 0

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM