使用intersect除了或联合关系代数

时间:2017-09-20 11:47:15

标签: sql sql-server relational-division

我正在努力解决问题。如果你问我,这似乎是一个脑筋急转弯。

给定两个表,当第二个表中的每条记录匹配时,仅返回第一个表中的值。因此,表1中的记录必须与表2中的每条记录匹配。如果表2的行数少于每行,我希望将其从最终结果中排除。

这必须在不使用count,having,group by的情况下完成。我必须用联合,交叉,除了存在来解决它。

我正在使用SQL Server BTW。

CREATE TABLE table1 (id int, lid int)
INSERT INTO table1  VALUES (1, 1),(1, 2),(1,3),(1,4),(2,1),(3,3),(4,4)

CREATE TABLE table2 (lid int)
INSERT INTO table2 VALUES (1),(2),(3),(4)

表1

id  lid
--------
1   1
1   2
1   3
1   4
2   1
3   3
4   4

表2

lid
-----
1
2
3
4

这里的方法“不是我应该解决的方式”。令人沮丧的是因为这个解决方案非常简单并且完全应该做的事情。我不能使用计数,分组和拥有。

SELECT id 
FROM dbo.table1, dbo.table2
WHERE table1.lid = table2.lid
GROUP BY id
HAVING COUNT(*) = (SELECT COUNT(*) FROM dbo.table2)

所以基本上我需要找到一种方法,当表2中没有完整的匹配项时从第一个表中排除结果。在这个例子中,表1中唯一的值与表2中的每个记录匹配是1. 2,3,4需要被排除在外。

2 个答案:

答案 0 :(得分:3)

您正在寻找的是一个名字。它被称为relational division。它在SQL中没有等效,尽管可以通过各种方式进行模拟。 Joe Celko has written one of the most complete blog posts about the topic

由于您必须在SQL中使用一些更基本的关系运算符,因此这可能是您的一个解决方案:

    <script>
        $(document).ready(function () {

        $("button").click(function () {
            alert(this.id); // or alert($(this).attr('id'));
        });

        $(".hh").click(function () {
            alert("gggg");
        });
        $("#btn2").click(function () {
            $("ol").append("<li> <button id='hh'>Appended item</button></li>");
        });
    });
</script>


 <!DOCTYPE html>
    <html>
    <head>
        <script 
  src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    </head>
      <body>
        <ol>
        </ol>
           <button id="btn2">Append list item</button>
      </body>
    </html>

用非正式的英语读取:

  

获取SELECT DISTINCT id FROM table1 t1a WHERE NOT EXISTS ( SELECT * FROM table2 WHERE NOT EXISTS ( SELECT * FROM table1 t1b WHERE t1a.id = t1b.id AND t2.lid = t1b.lid ) ) table1中没有元素的所有元素,这些元素与table2

中的元素不匹配

或者:

  

获取table1中的元素,其中所有符合table1

中的元素

答案 1 :(得分:1)

这是解决方案之一:

select distinct id from table1 AS T1
where not exists(
    select lid from table2
    except 
    select lid from table1 where id = T1.id
)