【问题标题】:CREATE VIEW of two tables with unique rows具有唯一行的两个表的 CREATE VIEW
【发布时间】:2021-04-30 08:55:00
【问题描述】:

我想创建两个表的视图,合并它们,其中 table1 中的列!= table2 中的列,然后插入没有重复列的行。

CREATE TABLE IF NOT EXISTS test(Birds, Animals, Air, Earth);
INSERT INTO test VALUES("Crow", "Dog", "Oxygen", "Not Flat");

CREATE TABLE IF NOT EXISTS test1 (Birds, Animals, Air, Earth, Sky);
INSERT INTO test1 VALUES("Crow", "Dog", "Oxygen", "Not Flat", "Blue");
INSERT INTO test1 VALUES("Eagle", "Dog", "Oxygen", "Not Flat", "Blue");

CREATE VIEW view_name AS SELECT * FROM test, test1 WHERE test.Birds != test1.Birds'

测试表:

Birds|Animals|Air|Earth
Crow|Dog|Oxygen|Not Flat

test1 表:

Birds|Animals|Air|Earth|Sky
Crow|Dog|Oxygen|Not Flat|Blue
Eagle|Dog|Oxygen|Not Flat|Blue

当前输出:

Birds|Animals|Air|Earth|Birds:1|Animals:1|Air:1|Earth:1|Sky
Crow|Dog|Oxygen|Not Flat|Eagle|Dog|Oxygen|Not Flat|Blue

期望的输出:

Birds|Animals|Air|Earth|Sky
Eagle|Dog|Oxygen|Not Flat|Blue

【问题讨论】:

  • SELECT Birds, Animals, Air, Earth FROM test1 EXCEPT SELECT Birds, Animals, Air, Earth FROM test?不清楚您要匹配哪些列
  • 错误:“鸟”附近:语法错误 |想匹配鸟类
  • 抱歉已编辑。但注意到您想要test 中不存在的Sky 列。所以试试SELECT Birds, Animals, Air, Earth, Sky FROM test1 WHERE EXISTS (SELECT test1.Birds, test1.Animals, test1.Air, test1.Earth EXCEPT SELECT test.Birds, test.Animals, test.Air, test.Earth FROM test)
  • 这个非常好用!我想我可以将其缩短为:SELECT * FROM test1 WHERE EXISTS (SELECT Birds EXCEPT SELECT Birds FROM test);
  • 我看到它优先考虑 test1 表是吗?将使用来自 test1 的每一列。

标签: sql sqlite


【解决方案1】:

这完全取决于您要比较的列。如果它只是一列,你可以这样做:

SELECT Birds, Animals, Air, Earth, Sky
FROM test1
WHERE EXISTS
    (SELECT test1.Birds
    EXCEPT
    SELECT test.Birds
    FROM test);

您也可以将此回合翻转到NOT EXISTS...INTERSECT 并获得相同的结果。


这也可以重写为EXISTS ... =

SELECT Birds, Animals, Air, Earth, Sky
FROM test1
WHERE NOT EXISTS (SELECT 1
    FROM test
    WHERE test.Birds = test1.Birds );

如果您还需要来自 test 的相反结果,您可以反过来做同样的事情,然后 UNION 结果。

【讨论】:

  • 好的,exist 函数让我能够从表中检索唯一对象,反之亦然?
  • 它返回一个布尔结果,告诉您子查询中是否有任何行。你可以在任何地方使用它。我们在WHERE 中使用了它来过滤。如果您只想从主表SELECT 中取出不同的行,请使用SELECT DISTINCT
【解决方案2】:

您可以通过不同的方式解决该问题。不过,我有一个解决方案给你。请检查查询并告诉我=>

DECLARE @test TABLE(Birds VARCHAR(50), Animals VARCHAR(50), Air VARCHAR(50), Earth VARCHAR(50)) ;
INSERT INTO @test VALUES('Crow', 'Dog', 'Oxygen', 'Not Flat');

DECLARE @test1 TABLE (Birds VARCHAR(50), Animals VARCHAR(50), Air VARCHAR(50), Earth VARCHAR(50),Sky VARCHAR(50));
INSERT INTO @test1 VALUES('Crow', 'Dog', 'Oxygen', 'Not Flat', 'Blue');
INSERT INTO @test1 VALUES('Eagle', 'Dog', 'Oxygen', 'Not Flat', 'Blue');

CREATE VIEW view_name AS
SELECT t1.* FROM @test t 
INNER JOIN @test1 t1 ON t.Birds<>t1.Birds

注意:此代码是用 SQL Server 编写的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2020-04-28
    • 2023-03-19
    • 2021-10-26
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多