天道酬勤,学无止境

SQL 查询中没有重复项(No duplicates in SQL query)

问题

我正在使用内部连接在 MySQL 中进行选择:

SELECT DISTINCT tblcaritem.caritemid, tblcar.icarid 
FROM tblcaritem 
INNER JOIN tblprivatecar ON tblcaritem.partid = tblprivatecar.partid 
INNER JOIN tblcar ON tblcaritem.carid = tblcar.carid 
WHERE tblcaritem.userid=72;

有时我会在结果中得到 tblcaritem.caritemid 的重复项。 我想确保永远不会得到 tblcaritem.caritemid 的重复项,但我该怎么做? 我尝试使用 DISTINCT 但它只是检查整行是否重复,我只想检查 tblcaritem.caritemid,有没有办法?

对不起,如果我没有很好地解释它,我不是最好的 SQL 查询。

回答1

GROUP BY tblcaritem.caritemid

回答2

这里的问题正如您所描述的:您正在检查整行的唯一性,您的数据集最终看起来像这样:

CarItemId    CarId
---------    -----
1            1
1            2
1            3
2            1
2            2
3            3

您需要没有重复的唯一 CarItemId,这意味着您还需要唯一的 CarId ---- 好吧,您有 3 个 CarId,SQL Server 应该选择哪一个?

除了将这些额外的 CarId 聚合起来之外,您在这里没有太多选择:

SELECT tblcaritem.caritemid, max(tblcar.icarid)
FROM tblcaritem
INNER JOIN tblprivatecar ON tblcaritem.partid = tblprivatecar.partid
INNER JOIN tblcar ON tblcaritem.carid = tblcar.carid
WHERE tblcaritem.userid=72
GROUP BY tblcaritem.caritemid
回答3

如果在 SELECT DISTINCT 查询中放置 2 个字段,它将返回 2 个字段的组合是唯一的行,而不仅仅是每个字段的唯一性。

如果您只需要每列的唯一结果,您将不得不运行 2 个单独的查询。

回答4

你可以在另一行做一个聚合函数......像max或min这样的东西

SELECT tblcaritem.caritemid, max(tblcar.icarid) 
FROM tblcaritem 
INNER JOIN tblprivatecar ON tblcaritem.partid = tblprivatecar.partid 
INNER JOIN tblcar ON tblcaritem.carid = tblcar.carid 
WHERE tblcaritem.userid=72
group by tblcaritem.caritemid;

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • SQL 如何删除选择查询中的重复项?(SQL How to remove duplicates within select query?)
    问题 我有一张看起来像这样的表: 如您所见,有一些日期重复,那么如何为该表中的每个日期只选择一行? “id_from_other_table”列来自与上表的 INNER JOIN 回答1 你提到有日期重复,但看起来它们在秒的精度上非常独特。 您能否澄清您开始考虑重复日期的日期精度 - 天,小时,分钟? 在任何情况下,您可能都希望将日期时间字段设置为地板。 在删除重复项时,您没有指明首选哪个字段,因此此查询将优先按字母顺序显示姓氏。 SELECT MAX(owner_name), --floored to the second dateadd(second,datediff(second,'2000-01-01',start_date),'2000-01-01') AS StartDate From MyTable GROUP BY dateadd(second,datediff(second,'2000-01-01',start_date),'2000-01-01') 回答2 有多个行的日期相同,但时间不同。 因此, DISTINCT start_date 将不起作用。 您需要的是:将 start_date 转换为 DATE(因此 TIME 部分消失了),然后执行 DISTINCT: SELECT DISTINCT CAST(start_date AS DATE) FROM
  • 从 sql union 中删除重复项(remove duplicates from sql union)
    问题 我正在使用联合(正确或错误)对我拥有的几个表执行一些基本的 sql 但我需要删除重复项。 有任何想法吗? select * from calls left join users a on calls.assigned_to= a.user_id where a.dept = 4 union select * from calls left join users r on calls.requestor_id= r.user_id where r.dept = 4 回答1 Union将删除重复项。 Union All没有。 回答2 除非您指定UNION ALL否则使用UNION自动删除重复行:http://msdn.microsoft.com/en-us/library/ms180026(SQL.90).aspx 回答3 其他人已经回答了您的直接问题,但也许您可以简化查询以消除问题(或者我错过了什么,像下面这样的查询真的会产生完全不同的结果?): select * from calls c join users u on c.assigned_to = u.user_id or c.requestor_id = u.user_id where u.dept = 4 回答4 如果您使用的是 T-SQL,那么从以前的帖子中可以看出 UNION 会删除重复项。 但如果不是,则可以使用
  • 从SQL查询中删除反向重复项(Remove reverse duplicates from an SQL query)
    问题 假设查询结果应返回字符串对(x,y)的列表。 我正在尝试消除反向重复。 我的意思是,如果(x,y)是结果之一,则(y,x)不应该稍后出现。 例子: column 1 (foreign key) column 2 (int) column 3 (string) 4 50 Bob 2 70 Steve 3 50 Joe 该表中表示的人员可以使用不同的第2列值多次出现。 我的查询需要打印具有相同列2值的每对名称: select e.column3, f.column3 from example as e, example as f where e.column2 = f.column2 (Bob, Bob) (Bob, Joe) (Joe, Bob) (Joe, Joe) 我升级了查询,以便删除双打: select e.column3, f.column3 from example as e, example as f where e.column2 = f.column2 and e.column3 <> f.column3 (Bob, Joe) (Joe, Bob) 现在我只希望它返回: (Bob, Joe). (乔,鲍勃)是反向重复,因此我不希望它出现在结果中。 无论如何,是否可以在一个查询中处理该问题? 回答1 首先,欢迎您来到2012年。我们已经使用逗号将关联表移开了。
  • SQL Server查询的最大大小? IN子句? 有没有更好的方法[重复](Maximum size for a SQL Server Query? IN clause? Is there a Better Approach [duplicate])
    问题 这个问题已经在这里有了答案: 11年前关闭。 可能重复: T-SQL WHERE col IN(…) SQL Server查询的最大大小是多少? (字符数) IN子句的最大大小? 我想我看到关于Oracle的项目限制为1000的一些信息,但是您可以将ANDing 2 IN一起解决。 SQL Server中是否存在类似问题? 更新因此,如果我需要从另一个系统(非关系数据库)中获取1000个GUID并对SQL Server进行“代码中的JOIN”操作,那么最好的方法是什么?是否要将1000个GUID列表提交给IN子句还是还有另一种更有效的技术? 我还没有测试过,但是我想知道是否可以将GUID提交为XML文档。 例如 <guids> <guid>809674df-1c22-46eb-bf9a-33dc78beb44a</guid> <guid>257f537f-9c6b-4f14-a90c-ee613b4287f3</guid> </guids> 然后针对Doc和Table进行某种XQuery JOIN。 效率低于1000个项目的IN子句? 回答1 每个SQL批处理都必须符合“批处理大小限制”:65,536 *网络数据包大小。 除此之外,您的查询还受运行时条件的限制。 它通常会用完堆栈大小,因为x IN(a,b,c)除了x = a OR x = b OR x = c之外什么都不是
  • 一对多关系无需使用“不同”即可获取重复的对象。 为什么?(One-To-Many relationship gets duplicate objects without using “distinct”. Why?)
    问题 我有一对多关系中的两个类和一个HQL查询,这有点奇怪。 即使我已经阅读了一些已经发布的问题,对我来说似乎也不是很清楚。 Class Department{ @OneToMany(fetch=FetchType.EAGER, mappedBy="department") Set<Employee> employees; } Class Employee{ @ManyToOne @JoinColumn(name="id_department") Department department; } 当我使用以下查询时,我得到重复的Department对象: session.createQuery("select dep from Department as dep left join dep.employees"); 因此,我必须使用不同的: session.createQuery("select distinct dep from Department as dep left join dep.employees"); 这是一种预期的行为吗? 我认为这很不寻常,因为它与SQL进行了比较。 回答1 Hibernate FAQ上对该问题进行了详尽的解释: 首先,您需要了解SQL以及OUTER JOIN在SQL中的工作方式。 如果您不完全理解和理解SQL中的外部联接
  • 避免在SQL Server的INSERT INTO SELECT查询中重复(Avoid duplicates in INSERT INTO SELECT query in SQL Server)
    问题 我有以下两个表: Table1 ---------- ID Name 1 A 2 B 3 C Table2 ---------- ID Name 1 Z 我需要将数据从Table1插入Table2 。 我可以使用以下语法: INSERT INTO Table2(Id, Name) SELECT Id, Name FROM Table1 但是,在我的情况下,表Table2可能存在重复的ID(在我的情况下,它只是“ 1 ”),我不想再次复制它,因为那样会引发错误。 我可以这样写: IF NOT EXISTS(SELECT 1 FROM Table2 WHERE Id=1) INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1 ELSE INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1 WHERE Table1.Id<>1 有没有不使用IF - ELSE的更好的方法? 我想避免基于某些条件的两个INSERT INTO-SELECT语句。 回答1 使用NOT EXISTS : INSERT INTO TABLE_2 (id, name) SELECT t1.id, t1.name FROM TABLE_1 t1 WHERE NOT EXISTS(SELECT
  • 单查询删除和显示重复记录(Single Query to delete and display duplicate records)
    问题 采访中被问到的问题之一是, 一张表有 100 条记录。 其中50个是重复的。 是否可以通过单个查询从表中删除重复记录并选择并显示剩余的 50 条记录。 这可以在单个 SQL 查询中实现吗? 谢谢 SN 回答1 使用 SQL Server 你会使用这样的东西 DECLARE @Table TABLE (ID INTEGER, PossibleDuplicate INTEGER) INSERT INTO @Table VALUES (1, 100) INSERT INTO @Table VALUES (2, 100) INSERT INTO @Table VALUES (3, 200) INSERT INTO @Table VALUES (4, 200) DELETE FROM @Table OUTPUT Deleted.* FROM @Table t INNER JOIN ( SELECT ID = MAX(ID) FROM @Table GROUP BY PossibleDuplicate HAVING COUNT(*) > 1 ) d ON d.ID = t.ID OUTPUT 语句显示被删除的记录。 更新: 以上查询将删除重复项并为您提供已删除的行,而不是剩余的行。 如果这对您很重要(总而言之,剩余的 50 行应该与删除的 50 行相同),您可以使用 SQL Server
  • 更新sql server数据库表中的2个重复项之一(Update one of 2 duplicates in an sql server database table)
    问题 我有一个表,其中的列具有重复的值。 我想更新2个重复值之一,例如row1 = tom和row2 = tom ..我想向其中之一添加1或a,这将用于同一列中的许多其他重复项。 基本上只需在每个重复项中添加一个数字或字母,这样就不再有重复项了。 我得到此查询,它将更新所有重复项,但不更新其中之一。 有人可以帮忙吗? UPDATE Table1 SET Column1 = 'a' WHERE exists (SELECT Column1 , COUNT(Column1 ) FROM Clients GROUP BY Column1 HAVING ( COUNT(Column1 ) > 1) ) 回答1 尝试使用CTE和PARTITION BY ;WITH cte AS ( SELECT ROW_NUMBER() OVER(PARTITION BY Column1 ORDER BY Column1 ) AS rno, Column1 FROM Clients ) UPDATE cte SET Column1 =Column1 +' 1 ' WHERE rno=2 回答2 我认为您正在寻找这个简单的更新; UPDATE Table1 SET Column1=Column1+CAST(id AS VARCHAR) WHERE id NOT IN ( SELECT MIN(id) FROM
  • 如何删除重复的行?(How can I remove duplicate rows?)
    问题 从相当大的SQL Server表中删除重复的行(即300,000+行)的最佳方法是什么? 当然,由于存在RowID标识字段,因此这些行将不是完美的重复项。 我的桌子 RowID int not null identity(1,1) primary key, Col1 varchar(20) not null, Col2 varchar(2048) not null, Col3 tinyint not null 回答1 假设没有空值,则对唯一列进行GROUP BY ,并SELECT MIN (or MAX) RowId作为要保留的行。 然后,只需删除没有行ID的所有内容: DELETE FROM MyTable LEFT OUTER JOIN ( SELECT MIN(RowId) as RowId, Col1, Col2, Col3 FROM MyTable GROUP BY Col1, Col2, Col3 ) as KeepRows ON MyTable.RowId = KeepRows.RowId WHERE KeepRows.RowId IS NULL 如果您使用的是GUID而不是整数,则可以替换 MIN(RowId) 和 CONVERT(uniqueidentifier, MIN(CONVERT(char(36), MyGuidColumn))) 回答2
  • SQL:如何基于两个字段查找重复项?(SQL: How to find duplicates based on two fields?)
    问题 我在Oracle数据库表中有行,对于两个字段的组合应该是唯一的,但是表上没有设置唯一的约束,因此我需要使用SQL查找所有违反约束的行。 不幸的是,我微不足道的SQL技能不能胜任这项任务。 我的表有三列相关:entity_id,station_id和obs_year。 对于每一行,station_id和obs_year的组合应该是唯一的,并且我想通过使用SQL查询将它们清空来找出是否存在违反此规定的行。 我已经尝试了以下SQL(由上一个问题建议),但对我不起作用(我得到ORA-00918列的定义不明确): SELECT entity_id, station_id, obs_year FROM mytable t1 INNER JOIN ( SELECT entity_id, station_id, obs_year FROM mytable GROUP BY entity_id, station_id, obs_year HAVING COUNT(*) > 1) dupes ON t1.station_id = dupes.station_id AND t1.obs_year = dupes.obs_year 有人可以建议我做错了什么,和/或如何解决这个问题? 回答1 SELECT * FROM ( SELECT t.*, ROW_NUMBER() OVER
  • 防止重复数据进入mysql数据库(Prevent duplicate data being entered into mysql database)
    问题 我试图让我的电子邮件订阅服务拒绝我的数据库中已经存在的电子邮件,这样用户就不会两次订阅同一封电子邮件。 这就是我所拥有的,但它不起作用,有什么想法吗? <?php if(!isset($_POST['submit'])) exit(); $vars = array('email'); $verified = TRUE; foreach($vars as $v) { if(!isset($_POST[$v]) || empty($_POST[$v])) { $verified = FALSE; } } if(!$verified) { echo "<p style='color:white; margin-top:25px;'>*Email required*</p>"; exit(); } $email = $_POST['email']; if($_POST['submit']) echo "<p style='color:white; margin-top:25px;'>*Check your inbox* </p>"; // Create connection $con=mysqli_connect("mysql.host","user","password","dbname"); // Check connection if (mysqli_connect_errno
  • 如果我停止长时间运行的查询,它会回滚吗?(If I stop a long running query, does it rollback?)
    问题 一个用于循环遍历1700万条记录以删除重复项的查询现在已经运行了大约16个小时,我想知道该查询是否立即停止,如果它将完成delete语句,或者在运行此语句时是否已将其删除询问? 确实,如果我停止了它,它是否完成删除或回滚? 我发现当我做一个 select count(*) from myTable 它返回的行(在执行此查询时)比开始的行数少大约5。 显然,服务器资源非常匮乏,这是否意味着此过程需要16个小时才能找到5个重复项(实际上有数千个重复项),并且可以运行数天? 该查询对2000行测试数据花费了6秒,并且在该数据集上效果很好,因此我认为整个数据集将花费15个小时。 有任何想法吗? 下面是查询: --Declare the looping variable DECLARE @LoopVar char(10) DECLARE --Set private variables that will be used throughout @long DECIMAL, @lat DECIMAL, @phoneNumber char(10), @businessname varchar(64), @winner char(10) SET @LoopVar = (SELECT MIN(RecordID) FROM MyTable) WHILE @LoopVar is not null
  • 在MySQL中,我可以复制一行以插入到同一张表中吗?(In MySQL, can I copy one row to insert into the same table?)
    问题 insert into table select * from table where primarykey=1 我只想复制一行以插入到同一表中(即,我想复制表中的现有行),但是我想这样做而不必在“选择”之后列出所有列,因为该表具有列过多。 但是当我这样做时,我得到了错误: 密钥1的条目“ xxx”重复 我可以通过创建另一个表来创建一个表,该表具有与要复制的记录的临时容器相同的列: create table oldtable_temp like oldtable; insert into oldtable_temp select * from oldtable where key=1; update oldtable_tem set key=2; insert into oldtable select * from oldtable where key=2; 有没有更简单的方法来解决这个问题? 回答1 我使用Leonard Challis的技术进行了一些更改: CREATE TEMPORARY TABLE tmptable_1 SELECT * FROM table WHERE primarykey = 1; UPDATE tmptable_1 SET primarykey = NULL; INSERT INTO table SELECT * FROM tmptable_1
  • 如何在SQL Server中删除重复的行?(How to delete duplicate rows in SQL Server?)
    问题 如何删除不存在unique row id重复行? 我的桌子是 col1 col2 col3 col4 col5 col6 col7 john 1 1 1 1 1 1 john 1 1 1 1 1 1 sally 2 2 2 2 2 2 sally 2 2 2 2 2 2 在重复删除后,我想保留以下内容: john 1 1 1 1 1 1 sally 2 2 2 2 2 2 我已经尝试了一些查询,但是我认为它们依赖于行ID,因为我没有得到期望的结果。 例如: DELETE FROM table WHERE col1 IN ( SELECT id FROM table GROUP BY id HAVING (COUNT(col1) > 1) ) 回答1 我喜欢CTE和ROW_NUMBER因为两者结合使我们能够看到删除(或更新)了哪些行,因此只需将DELETE FROM CTE...更改为SELECT * FROM CTE : WITH CTE AS( SELECT [col1], [col2], [col3], [col4], [col5], [col6], [col7], RN = ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY col1) FROM dbo.Table1 ) DELETE FROM CTE WHERE RN > 1 演示
  • 从没有唯一标识的重复记录中获取第一条记录(Get top first record from duplicate records having no unique identity)
    问题 我需要从下面给出的表中的每个重复记录集中获取第一行。 我需要在视图中使用此查询 请不要临时表,因为我已经通过添加标识列和最小函数并分组来完成它。 我需要没有临时表或表变量的解决方案 这只是示例数据。 原始表中有 1000 条记录,我只需要前 1000 条记录的结果,因此不能使用不同的 我正在使用 SQL Server 2005 谢谢。 回答1 答案具体取决于“前 1000 条不同”记录的含义。 如果你的意思是你想返回最多 1000 条不同的记录,不管表中有多少重复,那么写这个: SELECT DISTINCT TOP 1000 id, uname, tel FROM Users ORDER BY <sort_columns> 如果您只想搜索表中的前 1000 行,并且可能返回的不同行远少于 1000 行,那么您可以使用子查询或 CTE 编写它,如下所示: SELECT DISTINCT * FROM ( SELECT TOP 1000 id, uname, tel FROM Users ORDER BY <sort_columns> ) u 如果您不关心返回哪些记录,则ORDER BY当然是可选的。 回答2 查找已订购 1 次或多次的所有产品...(一种重复记录) SELECT DISTINCT * from [order_items] where productid in
  • 为什么fputcsv产生重复的列?(Why is fputcsv producing duplicate columns?)
    问题 我在WordPress网站上添加了一个下载按钮,该按钮将查询我们的数据库,并以CSV格式提供结果。 一切正常,除了生成的CSV对于返回的每一列都有一个重复的列。 我们已经检查了SQL查询,它没有重复项。 这是我们生成CSV的方法: $rows = //Call to SQL query function $fp = fopen('php://output', 'w'); fputcsv($fp, array_keys($rows)); foreach ($rows as $row) { fputcsv($fp, $row); } $filename = "EventResults.csv"; header('Content-Type: text/csv'); header("Content-Transfer-Encoding: Binary"); header("Content-disposition: attachment; filename=$filename"); 我们将SQL返回值转换为如下所示的PHP数组: $sql = "SELECT * FROM TABLE"; $statement = $this->db->prepare($sql); $statement->execute(); return $statement->fetchAll(); 结果看起来像这样
  • 在MS Access中管理和调试SQL查询(Managing and debugging SQL queries in MS Access)
    问题 MS Access管理原始SQL查询的功能有限:编辑器很糟糕,没有语法突出显示,它将原始SQL重新格式化为一个长字符串,并且您无法插入注释。 调试复杂的SQL查询也很麻烦:要么必须将其拆分为许多较小的查询,当您的模式更改时,这些查询将变得难以管理,或者您最终遇到了一个庞大的查询,这是调试和更新的噩梦。 您如何在MS Access中管理复杂的SQL查询以及如何调试它们? 编辑目前,我主要只是使用Notepad ++进行语法着色,而使用SQL Pretty Printer来重新格式化Access中的原始SQL。 使用外部存储库很有用,但是始终存在使两个版本不同步的风险,并且在Access中尝试查询之前,您仍然必须删除注释。 回答1 为了进行调试,我在一个单独的文本编辑器中对其进行了编辑,使我可以合理地设置其格式。 当我发现需要进行更改时,我在文本编辑器中编辑该版本,然后将其粘贴回Access中,而不用在Access中编辑该版本。 仍然是主要的PITA。 回答2 我有一些VBA中特定于SQL的技巧。 将您的SQL代码放入字符串变量。 我曾经这样做: DoCmd.RunSQL "SELECT ..." 这很难管理。 改为执行以下操作: strSQL = "SELECT ..." DoCmd.RunSQL strSQL 通常,除非您只看到正在运行的内容,否则您无法修复查询。 为此
  • SQL 更新查询中的 .ExecuteNonQuery() 错误 [重复](Error on .ExecuteNonQuery() in SQL Update Query [duplicate])
    问题 这个问题在这里已经有了答案: 添加 SQL 查询状态(1 个回答) 7年前关闭。 我正在尝试使用 SQL 查询更新 Access 数据库,每当我单击保存按钮时,它都会生成错误 System.Data.dll 中发生类型为“System.Data.OleDb.OleDbException”的未处理异常附加信息:没有为一个或多个必需参数指定值。 并突出显示.ExecuteNonQuery() 。 你们能帮我解决这个问题吗? 我是 vb.net 的新手。 提前致谢。 Private Sub SaveButton_Click(sender As Object, e As EventArgs) Handles SaveButton.Click Dim empNum As String Dim empFname As String Dim empLname As String Dim empDept As String Dim empStat As String Dim empYears As String empNum = eNumText.Text empFname = empFnameText.Text empLname = empLnameText.Text empDept = DeptText.Text empStat = StatText.Text empYears =
  • 下拉选项查询sql返回重复[重复](Dropdown option query sql return repeated [duplicate])
    问题 这个问题在这里已经有了答案: 从 MySQL 查询中删除重复的结果(5 个回答) 5年前关闭。 我如何停止重复查询我的下拉列表,如下图所示? 请选择CD价格: <select name="CDPrice"> <option value=""> <?php include 'database_conn.php'; if (!( is_object($conn) && ( get_class($conn) == 'mysqli' ))) { die("DB connection failure."); } $rsCDprice = mysqli_query($conn, "SELECT nmc_cd.CDPrice FROM nmc_cd"); if (!$rsCDprice) { die("No result from DB query."); //probably invalid SQL, table error, etc. } if ($rsCDprice->num_rows < 1) { die("No rows returned from DB query."); //query runs OK, but nothing is found in DB to match. } while ($Catpriceresult = mysqli_fetch_array(
  • 我有一个整数数组,如何在mysql查询中使用每个整数(在php中)? [复制](I have an array of integers, how do I use each one in a mysql query (in php)? [duplicate])
    问题 这个问题已经在这里有了答案: mysqli bind_param用于字符串数组(6个答案) 3个月前关闭。 我有一个充满随机内容项ID的数组。 我需要运行mysql查询(数组中的ID在WHERE子句中),并使用数组中的每个ID并按照它们在所述数组中出现的顺序进行操作。 我该怎么做? 对于数组中的每个ID,这将是一个UPDATE查询。 回答1 与几乎所有“如何在PHP中执行SQL”问题一样,您实际上应该使用准备好的语句。 这并不难: $ids = array(2, 4, 6, 8); // prepare an SQL statement with a single parameter placeholder $sql = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id = ?"; $stmt = $mysqli->prepare($sql); // bind a different value to the placeholder with each execution for ($i = 0; $i < count($ids); $i++) { $stmt->bind_param("i", $ids[$i]); $stmt->execute(); echo "Updated record ID: $id\n"; }