【问题标题】:sql query to extract unique recordssql查询提取唯一记录
【发布时间】:2015-07-17 21:10:13
【问题描述】:

假设我的表只包含 2 个字段,ID 和产品,并说我的结构看起来像这样

1       微软

0     思科

2      思科

3      vmware

0     土坯

0     微软

我需要编写一个查询,列出具有 id=0 的记录,但只有,

0     土坯

因为其他两个产品 miocrsoft 和 cisco 有另一条记录确实有 ID,所以我可以排除它们。

我希望我清楚我想要实现的目标。请让我知道这是否可以在 sql 中完成

【问题讨论】:

  • 您使用的是哪个 DBMS? sql server mysql
  • MySQL xor SQLServer,请
  • sql server .. 抱歉回复晚了

标签: mysql sql-server


【解决方案1】:

是的,这可以使用基本聚合来实现。请注意我是如何发布消耗性数据的?这是你应该做的事情。创建可用数据比编写查询花费的时间要长得多。

with something(Col1, Col2) as
(
    select 1, 'microsoft' union all
    select 0, 'cisco' union all
    select 2, 'cisco' union all
    select 3, 'vmware' union all
    select 0, 'adobe' union all
    select 0, 'microsoft'
)

select Col2
from something
group by Col2
having MAX(Col1) = 0

【讨论】:

    【解决方案2】:

    你可以使用NOT EXISTS:

    SELECT id, product
    FROM mytable AS t1
    WHERE id = 0 AND NOT EXISTS (SELECT 1
                                 FROM mytable AS t2
                                 WHERE t1.product = t2.product AND t2.id <> 0)
    

    Demo here

    【讨论】:

      【解决方案3】:

      试试这样的

      SELECT *
      FROM table
      WHERE id = 0 and product not in
      (
          SELECT product
          FROM table
          WHERE id <> 0
      )
      

      【讨论】:

      • 这行得通,但效率不是很高,因为它必须击中基表两次。 where 子句中还有 nonSARGable 谓词。
      • 查询优化器几乎肯定能够命中基表一次,但我同意你的第二点。但是,对于这种情况,它不会对性能造成太大影响。
      • 如果表只有几行,当然不会。 :)
      • 我的表很容易有 2000000 行。有没有其他更好的解决方案
      • 如果需要,请使用@SeanLange 答案
      【解决方案4】:

      您可以使用以下代码来获得答案: 在代码的第一部分中获取所有产品。 第二部分同样的产品设置一个数组。 最终,相同的产品从 ID 为 0 的产品中移除

      ("我的数据库名 = stackoverflow" , "我的表名 = stack" , "我的字段 = id,name")

      <?php 
      $conn = mysql_connect('localhost','root','') or die ("erorr");
      mysql_select_db('stackoverflow');
      $query1 = "SELECT name FROM stack";
      $result = mysql_query($query1);
      echo "<b>Show the products:</b>";
      echo "<br>";
      $y;
      $z;
      $i = 0;
      $k = 0;
      while ($x = mysql_fetch_array($result)) {
          echo $x[0];
          echo "<br>";
          $y[$i] = $x[0];
          if ($i > 0) {
              for ($j=0; $j < $i; $j++) { 
                  if ($y[$i] == $y[$j]) {
                      if ($k > 0) {
                          for ($q=0; $q < $k; $q++) { 
                              if ($z[$q] == $y[$i]) {
                              break 2;
                              }
                          }
                      }
                      $z[$k] = $y[$i];
                      $k++;
                      break 1;
                  }
              }
          }
          $i++;
      }
      echo "<hr>";
      echo "<b>Show duplicate products:</b>";
      echo "<br>";
      $k=0;
      while (isset($z[$k])) {
          echo $z[$k];
          $k++;
      echo "<br>";
      }
      $query2 = "SELECT name FROM stack WHERE id=0";
      $result = mysql_query($query2);
      echo "<hr>";
      echo "<b>Show answers:</b>";
      echo "<br>";
      while ($x = mysql_fetch_array($result)) {
          if (!in_array($x[0], $z)) {
          echo $x[0];
          echo "<br>";
          }
      }
       ?>
      

      但是这种反应,是没有优化和表坏的设计。因为每个表都应该有一个主键,并且逐个搜索表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-23
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        • 1970-01-01
        相关资源
        最近更新 更多