SQL如何选择与任何国家/地区无关的计划

时间:2018-02-09 14:32:06

标签: sql-server

请检查http://sqlfiddle.com/#!18/1acd1/2

我通过UserId获取用户的countryid,以便根据用户的国家/地区获取计划。

我有针对各个国家/地区的计划,但我没有为所有国家/地区制定计划,所以当我通过用户ID时,我目前还没有针对该用户/国家/地区的任何计划,但没有任何行返回但是我需要向该用户显示默认计划(具有国家ID =' 1'的计划)。

请注意小提琴,如果是userid =' 4'没有行返回所以在这种情况下我需要向该用户显示默认计划。所有默认计划都有countryid = 1

我希望你理解我的问题:)谢谢

2 个答案:

答案 0 :(得分:1)

这是我的看法。

我采用了不同的方法并从tblProfile开始,因为您对此查询的输入实际上是UserId所以我发现遵循此过程更合乎逻辑:

  1. 对于UserId,请抓取PlanId
  2. CountryId
  3. 如果CountryId中没有用户lstCountryPlanId没有CountryId,请使用默认CountryId=1替换用户CountryId (如下面的评论所述)
  4. 最后,获取最终CREATE TABLE lstCountry( CountryID int, CountryTitle varchar(100), CurrencyCode varchar(3)) INSERT INTO lstCountry (CountryId, CountryTitle, CurrencyCode) VALUES (1, 'USA', 'USD'), (2, 'GB', 'GBP'), (3, 'France', 'EUR') CREATE TABLE tblProfile( UserId int, CountryId int) INSERT INTO tblProfile (UserId, CountryId) VALUES (1, 1), (2, 2), (3, 3), (4, 4) CREATE TABLE tblPlan ( PlanId int, PlanTitle nvarchar(50), PlanPrice money, CountryId int) INSERT INTO tblPlan (PlanId, PlanTitle, PlanPrice, CountryId) VALUES (1, 'PlanDefault', 10, 1), (2, 'Plan2', 20, 2), (3, 'Plan3', 30, 3), (4, 'PlanDefault', 40, 1), (5, 'Plan5', 50, 2)
  5. 的计划详情和货币

    表格定义

    select distinct f.PlanId,
    f.PlanTitle,
    f.PlanPrice,
    e.CurrencyCode
    from (
      select case when c.PlanId is null then '1' else a.CountryId end as CountryId
      from tblProfile a
      left join lstCountry b on a.CountryId=b.CountryId
      left join tblPlan c on b.CountryId=c.CountryId
      where UserId=4
    ) d
    inner join lstCountry e on d.CountryId=e.CountryId
    inner join tblPlan f on d.CountryId=f.CountryId
    

    <强>查询

    UserId=1

    | PlanId | PlanTitle | PlanPrice | CurrencyCode | |--------|-------------|-----------|--------------| | 1 | PlanDefault | 10 | USD | | 4 | PlanDefault | 40 | USD | 的结果:

    UserId=2

    | PlanId | PlanTitle | PlanPrice | CurrencyCode | |--------|-----------|-----------|--------------| | 2 | Plan2 | 20 | GBP | | 5 | Plan5 | 50 | GBP |

    的结果
    UserId=3

    | PlanId | PlanTitle | PlanPrice | CurrencyCode | |--------|-----------|-----------|--------------| | 3 | Plan3 | 30 | EUR |

    的结果
    UserId=4

    | PlanId | PlanTitle | PlanPrice | CurrencyCode | |--------|-------------|-----------|--------------| | 1 | PlanDefault | 10 | USD | | 4 | PlanDefault | 40 | USD |

    的结果
    "wasdsadas" : {
        "asignatura" : 6,
        "nivel" : 2,
        "unidad" : [ [ {
          "OA" : 1,
          "indicadores" : [ "Testing", "testeo2" ],
          "objetivo" : "Testeo"
        } ], [ {
          "OA" : 2,
          "indicadores" : [ "testing", "testeo2" ],
          "objetivo" : "testeo 2"
        } ] ]
      }
    

    这是SQL小提琴 http://sqlfiddle.com/#!18/7068c/8/0

答案 1 :(得分:0)

我认为表的LEFT JOIN和第二个解析可能会实现这一点。如果没有,那么请查看@JuanCarlosOropeza评论并使用样本和预期数据更新您的帖子。

SELECT p.PlanId,
       p.PlanTitle,
       p.PlanPrice,
       ISNULL(c.CurrencyCode, d.CurrencyCode) AS CurrencyCode
FROM tblPlan p
     LEFT JOIN lstCountry c ON c.CountryId = p.CountryId
     LEFT JOIN lstCountry d ON c.CountryId IS NULL
                           AND d.CountryId = 226
WHERE P.CountryId = (SELECT sq.CountryId
                     FROM tblProfile sq --Not sure if this requires a Default Country
                     WHERE  UserId = @UserId) 
  AND p.IsVisible = '1';