如何从JOIN SQL查询中获得准确的结果?

时间:2018-01-09 22:00:58

标签: sql sql-server join

我写了一个只在SQL-Server上运行的SQL查询。不幸的是,我没有得到我想要的结果。这是一个LEFT JOIN查询。我只期待明显的价值,但获得重复的价值,我不想要。我还使用了SELECT DISTINCTGroup BY,但它无法正常使用。谁能指导我下面SQL的正确查询?

SQL查询:

USE smileTour; 

SELECT 
  travelCountrySet.CountryID,
  travelOffer.OfferID,                  
  travelCountry.CountryName         
FROM travelOffer
LEFT JOIN travelCountrySet ON travelOffer.OfferID = travelCountrySet.OfferID
LEFT JOIN travelCountry ON travelCountry.CountryID = travelCountrySet.CountryID
WHERE  travelOffer.Active = 1

表分别是travelOffer,travel country和travelCountrySet。关键点在于travelCountrySet表有两个列字段OfferID和CountryID,travelOffer和travelCountry可以通过它们连接。所以我做了LEFT JOIN,这不是期望的结果。结果是

=====================================================
    CountryID----OfferID----CountryName
1 ---- 4     ----  1    ----  A 
2 ---- 15    ----  1    ----  B 
3 ---- 4     ----  2    ----  C
4 ---- 11    ----  4    ----  D
5 ---- 4     ----  5    ----  E
6 ---- 15    ----  5    ----  F
7 ---- 11    ----  6    ----  G
8 ---- 15    ----  7    ----  H

这里显示了8行,但我只想要7行,因为我只有7个优惠。以上结果显示OfferId 1是两次,OfferId 5是两次。我每个只需要一次。

感谢您的支持!

2 个答案:

答案 0 :(得分:0)

您可能想要查看the distinct function。它将返回唯一的行。由于您显示的是相同offerID的国家/地区名称不同,因此您将收到不同的行。它将返回所选列的每个唯一组合(offerID 1 country 1& offerID 1 country 2是2个不同的行)。

如果您需要不同的优惠,那么您需要确定如何汇总这些国家/地区。这里有6个不同的优惠,可能是因为travelID 3的travelOffer.Active = 1是假的。如果您希望链接到优惠的国家/地区数量最多,那么您可以pivot它并拥有一列对于每个国家/地区,或者您可以拥有一个国家/地区,但只要您在新行中列出每个国家/地区并且您至少有一个具有多个国家/地区的要约,就不会有明显的OfferID。

Here是我为此做的SQL小提琴

您可以尝试使用此功能获取优惠列表及其所在国家/地区数量:

SELECT 
  travelOffer.OfferID,
  COUNT(travelCountrySet.CountryID) AS country_count,
FROM travelOffer
LEFT JOIN travelCountrySet ON travelOffer.OfferID = travelCountrySet.OfferID
LEFT JOIN travelCountry ON travelCountry.CountryID = travelCountrySet.CountryID
WHERE  travelOffer.Active = 1
GROUP BY travelOffer.OfferID

如果您有每个优惠的国家/地区的上限,您也可以使用支点。这将只列出最多4个国家/地区(根据需要更新):

SELECT
  OfferID,
  [1] AS Country1,
  [2] AS Country2,
  [3] AS Country3,
  [4] AS Country4
FROM(
  SELECT
    travelOffer.OfferID,
    travelCountry.CountryName,
    ROW_NUMBER() OVER (PARTITION BY travelOffer.OfferID ORDER BY travelCountry.CountryName) AS rn
  FROM travelOffer
  LEFT JOIN travelCountrySet ON
    travelOffer.OfferID = travelCountrySet.OfferID
  LEFT JOIN travelCountry ON
travelCountrySet.CountryID = travelCountry.CountryID
  WHERE  travelOffer.Active = 1
  ) AS source_table
  PIVOT
  (
    MAX(CountryName)
    FOR rn IN ([1],[2],[3],[4])
  ) AS pivot_table

答案 1 :(得分:0)

结果是正确的。优惠ID 1可在2个国家/地区找到,因此您需要按原样接受它,或使用汇总功能选择此优惠可用的第一个/最后一个国家/地区。连接应该为所有匹配的键提供结果,因此这已经是一个完美的结果。您可以调整查询以获得所需的输出(仅获得一次优惠)。