mysql—当您连接两个具有相同模式的表并检查除一个字段外的所有字段是否相等时,如何避免在sql中编写冗长的where子句?

kuuvgm7e  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(295)

如果不在where子句中编写许多由和连接的条件,您是否可以在sql中使用相同的模式内部连接两个表,以便where子句检查两个表之间除一个字段外的所有字段的相等性?如果有很多字段(比如200个字段),sql语句就会变得太长。我在用mariadb。
例如,假设我有以下内容,其中“id”是主键:
表a(身份证、姓名、日期、出生地、住所、性别、年龄、身高、体重)
表b(身份证、姓名、日期、出生地、住所、性别、年龄、身高、体重)
当我内部联接表\u a和表\u b时,为了得到表\u a中的值和表\u b中的对应值对于除id以外的所有字段都相同的所有行,我只能考虑执行以下操作:

SELECT * FROM TABLE_A INNER JOIN TABLE_B WHERE 
    TABLE_A.name = TABLE_B.name AND 
    TABLE_A.date = TABLE_B.date AND 
    TABLE_A.origin = TABLE_B.origin AND 
    TABLE_A.residence = TABLE_B.residence AND 
    TABLE_A.gender = TABLE_B.gender AND 
    TABLE_A.age = TABLE_B.age AND 
    TABLE_A.height = TABLE_B.height AND 
    TABLE_A.weight = TABLE_B.weight;

有没有更好的方法不需要写超长where子句?

d7v8vwbk

d7v8vwbk1#

如果你告诉我们真正的目标是什么,我们也许能想出一个解决方案,避免这种混乱 WHERE . 同时,以下是一些相关查询:
这将对行集进行重复数据消除:

( SELECT * FROM TableA )
        UNION DISTINCT
        ( SELECT * FROM TableB )

这也将:

SELECT DISTINCT *
    FROM
    (
        ( SELECT * FROM TableA )
        UNION ALL
        ( SELECT * FROM TableB )
    )

这里有另一种方法可以考虑。它仍然需要大量的输入,但您可以复制和粘贴来完成一些工作:

SELECT ...
    FROM TableA
    JOIN TableB
      ON CONCAT_WS("\t", a.name, a.date, ... ) =
         CONCAT_WS("\t", b.name, b.date, ... )

如何在不键入列的情况下获取列列表:

SET group_concat_len = 12345;  -- something big enough = 12345;
SELECT  GROUP_CONCAT(column_name)
    FROM  information_schema.columns
    WHERE  table_schema = '...'    -- use the database name
      AND  table_name = 'Table_A'
      AND  column_name != 'id';    -- to exclude `id`
qpgpyjmq

qpgpyjmq2#

通过将一列重命名为不同的名称,对每个表进行子查询
select as . 那么 natural join 子查询。这是一个
inner join using 所有公共/剩余列(或者只使用一个子查询&另一个原始表。)
(请注意,如果您的规范将来要完全连接到您现在正在连接的列上&可能会有更多的列被添加到一个或两个表中,那么您需要列出当前的列—例如,在 using . 这与 select *select 特定列的名称。我想,在加入后,您希望如何获得所有当前列或当前联接列?如果您使用构建过程来减少 select 那你就可以用在 inner join .)

相关问题