我正在尝试编写一个SQL查询,该查询从一个表中选择多个列,并且只在一列上使用distinct运算符。
表很简单。列是:
tblFruit_ID, tblFruit_FruitType, tblFruit_FruitName
int NVarChar Text
我正在尝试选择所有tblFruit_FruitType及其对应的tblFruit_ID。
我试过了:
Select Distinct(tblFruit_FruitType), tblFruit_ID FROM tblFruit
- 返回所有结果,而不仅仅是不同的结果
Select tblFruit_FruitType, tblFruit_ID FROM tblFruit Group By tblFruit_FruitType
- 列tblFruit_ID的错误在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
Select tblFruit_FruitType, tblFruit_ID FROM tblFruit Group By tblFruit_FruitType, tblFruit_ID
- 返回所有结果,而不仅仅是不同的结果
我也检查了这些类似的帖子,但无法正常工作:(
mySQL select one column DISTINCT, with corresponding other columns
SQL Server Distinct Union for one column
希望这是一个足够的答案信息。
感谢您的时间!
编辑(样本数据和期望结果)
tblFruit_ID, tblFruit_FruitType, tblFruit_FruitName
int NVarChar Text
1 Citrus Orange
2 Citrus Lime
3 Citrus Lemon
4 Seed Cherry
5 Seed Banana
结果:
1 Citrus
4 Seed
答案 0 :(得分:29)
select * from tblFruit where
tblFruit_ID in (Select max(tblFruit_ID) FROM tblFruit group by tblFruit_FruitType)
答案 1 :(得分:22)
您必须对未进行分组的列使用聚合函数。在这个例子中,我随意选择了Min函数。您正在组合具有相同FruitType
值的行。例如,如果我有两行具有相同的FruitType
值但不同的Fruit_Id
值,系统应该怎么做?
Select Min(tblFruit_id) As tblFruit_id
, tblFruit_FruitType
From tblFruit
Group By tblFruit_FruitType
答案 2 :(得分:0)
我需要做同样的事情并且不得不查询查询以获得结果
我设置了第一个查询以引入表中的所有ID以及过滤所需的所有其他信息:
SELECT tMAIN.tLOTS.NoContract, tMAIN.ID
FROM tMAIN INNER JOIN tLOTS ON tMAIN.ID = tLOTS.id
WHERE (((tLOTS.NoContract)=False));
将此保存为Q04_1 -0,这会返回1229个结果(有63个唯一记录可供查询 - 具有多个LOT的soime)
SELECT DISTINCT ID
FROM q04_1;
保存为q04_2
然后我写了另一个查询,它带来了与ID
相关的必要信息SELECT q04_2.ID, tMAIN.Customer, tMAIN.Category
FROM q04_2 INNER JOIN tMAIN ON q04_2.ID = tMAIN.ID;
完成了一项款待,让我得到了我需要的东西 - 返回了63条与客户和类别详细信息相关的独特记录。
这就是我解决这个问题的方法,因为我无法通过工作来完成工作 - 虽然我相当“浑浑噩噩”,但仍然很谨慎(所以请保持温和和建设性的反馈)
答案 3 :(得分:0)
select * from
(select
ROW_NUMBER() OVER(PARTITION BY tblFruit_FruitType ORDER BY tblFruit_FruitType DESC) as tt
,*
from tblFruit
) a
where a.tt=1
答案 4 :(得分:0)
您可以通过多种方法来区分一列或多列中的值。
使用GROUP BY
SELECT DISTINCT MIN(o.tblFruit_ID) AS tblFruit_ID,
o.tblFruit_FruitType,
MAX(o.tblFruit_FruitName)
FROM tblFruit AS o
GROUP BY
tblFruit_FruitType
使用子查询
SELECT b.tblFruit_ID,
b.tblFruit_FruitType,
b.tblFruit_FruitName
FROM (
SELECT DISTINCT(tblFruit_FruitType),
MIN(tblFruit_ID) tblFruit_ID
FROM tblFruit
GROUP BY
tblFruit_FruitType
) AS a
INNER JOIN tblFruit b
ON a.tblFruit_ID = b.tblFruit_I
使用带有子查询的联接
SELECT t1.tblFruit_ID,
t1.tblFruit_FruitType,
t1.tblFruit_FruitName
FROM tblFruit AS t1
INNER JOIN (
SELECT DISTINCT MAX(tblFruit_ID) AS tblFruit_ID,
tblFruit_FruitType
FROM tblFruit
GROUP BY
tblFruit_FruitType
) AS t2
ON t1.tblFruit_ID = t2.tblFruit_ID
使用窗口功能只能区分一列
SELECT tblFruit_ID,
tblFruit_FruitType,
tblFruit_FruitName
FROM (
SELECT tblFruit_ID,
tblFruit_FruitType,
tblFruit_FruitName,
ROW_NUMBER() OVER(PARTITION BY tblFruit_FruitType ORDER BY tblFruit_ID)
rn
FROM tblFruit
) t
WHERE rn = 1
使用多栏窗口功能
SELECT tblFruit_ID,
tblFruit_FruitType,
tblFruit_FruitName
FROM (
SELECT tblFruit_ID,
tblFruit_FruitType,
tblFruit_FruitName,
ROW_NUMBER() OVER(PARTITION BY tblFruit_FruitType, tblFruit_FruitName
ORDER BY tblFruit_ID) rn
FROM tblFruit
) t
WHERE rn = 1
答案 5 :(得分:0)
我认为最简单,最好的解决方案是使用OUTER APPLY
。您只能将DISTINCT
与一个字段一起使用,而要利用OUTER APPLY
来检索有关该记录的更多数据。
要测试该解决方案,请执行以下查询,该查询首先创建一个临时表,然后检索数据:
DECLARE @tblFruit TABLE (tblFruit_ID int, tblFruit_FruitType varchar(10), tblFruit_FruitName varchar(50))
SET NOCOUNT ON
INSERT @tblFruit VALUES (1,'Citrus ','Orange')
INSERT @tblFruit VALUES (2,'Citrus','Lime')
INSERT @tblFruit VALUES (3,'Citrus','Lemon')
INSERT @tblFruit VALUES (4,'Seed','Cherry')
INSERT @tblFruit VALUES (5,'Seed','Banana')
SELECT DISTINCT (f.tblFruit_FruitType), outter_f.tblFruit_ID
FROM @tblFruit AS f
OUTER APPLY (
SELECT TOP(1) *
FROM @tblFruit AS inner_f
WHERE inner_f.tblFruit_FruitType = f.tblFruit_FruitType
) AS outter_f
结果将是:
Citrus 1
Seed 4