我写了一个只在SQL-Server上运行的SQL查询。不幸的是,我没有得到我想要的结果。这是一个LEFT JOIN查询。我只期待明显的价值,但获得重复的价值,我不想要。我还使用了SELECT DISTINCT
和Group 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是两次。我每个只需要一次。
感谢您的支持!
答案 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个国家/地区找到,因此您需要按原样接受它,或使用汇总功能选择此优惠可用的第一个/最后一个国家/地区。连接应该为所有匹配的键提供结果,因此这已经是一个完美的结果。您可以调整查询以获得所需的输出(仅获得一次优惠)。