SQL Query,从没有公共密钥的表返回值

时间:2013-10-21 15:42:36

标签: sql sql-server

我希望有一个想法,以最好的方式来解决我正在尝试做的事情。

我有一张包含交易清单的表格。每个事务都有DateTime格式的PostDate。我有另一张表保存财政期间值。该表包含以下列; FiscalYear,FiscalMonth,StartDate,EndDate。

我正在尝试编写一个查询,它将返回我的事务表中的所有值,以及PostDate的FiscalYear和FiscalMonth。所以我想我只是在PostDate介于StartDate和EndDate之间时尝试返回FiscalYear和FiscalMonth值。

我已经尝试过使用Subbuery,但我对它们的经验很少,并且一直返回一条错误消息,即子查询返回的值超过1。帮助将不胜感激

编辑:对不起,这是我试过的查询。我还将标题从“没有加入”更改为“没有共同密钥”以更准确地反映我的问题

    SELECT Transactions.PostDate, Transactions.TranKey, Transactions.CustKey, 
                      (SELECT FiscalPeriod.FiscPer
                        FROM FiscalPeriod
                        WHERE (Transactions.PostDate > CONVERT(Datetime, FiscalPeriod.StartDate, 102)) AND (Transactions.PostDate < CONVERT(DATETIME, FiscalPeriod.EndDate, 102))) AS FisPer
    FROM Transactions 

2 个答案:

答案 0 :(得分:1)

您应该能够消除子查询并使用这样的连接:

SELECT Transactions.PostDate, Transactions.TranKey, Transactions.CustKey, FiscPer
FROM Transactions 
INNER JOIN FiscalPeriod ON (PostDate BETWEEN StartDate AND EndDate)

虽然这不完全相同 - 即使财务表未涵盖postdate,子查询也会显示所有记录,如果需要,请将此连接更改为LEFT JOIN。

答案 1 :(得分:0)

也许你需要加入这两个共同点的表格,或者做这样的事情:

 SELECT Transactions.PostDate, Transactions.TranKey, Transactions.CustKey, 
                      (SELECT **distinct** FiscalPeriod.FiscPer
                        FROM FiscalPeriod
                        WHERE (Transactions.PostDate > CONVERT(Datetime, FiscalPeriod.StartDate, 102)) AND (Transactions.PostDate < CONVERT(DATETIME, FiscalPeriod.EndDate, 102))) AS FisPer
    FROM Transactions 

记住,如果你有这个:
2004-01
2004-02
2004-03
对于fiscalperiod.FiscPerdistinct关键字无效