SQL Server:交叉引用一个表中的多个列与另一个表中的多个列

Posted

技术标签:

【中文标题】SQL Server:交叉引用一个表中的多个列与另一个表中的多个列【英文标题】:SQL Server: Cross Referencing multiple columns in 1 table with multiple columns in another 【发布时间】:2015-09-29 13:13:33 【问题描述】:

我有 2 个表,每个表包含 10 个整数字段。我需要从 table2 中检索记录,如果其中一个字段值存在于 table1 中的任何一列中。例如;

因此,如果我有一个包含 1 的变量(表 1 中记录的 id),我需要 sql 来从表 2 中检索记录 2 和 3,因为表 2 中的任何 cat 字段中都存在 3400 或 3500。希望有道理;-)

【问题讨论】:

问题是?您的查询到底在哪里卡住了? 问题是:如果我有一个包含 1 的变量(表 1 中的记录 ID),我需要 sql 来从表 2 中检索记录 2 和 3,因为 3400 或 3500存在于表 2 中的任何 cat 字段中。希望这是有道理的 ;-) 是的,这是有道理的。但是你应该至少尝试过一些你被卡住并需要帮助的东西。但是,您似乎没有尝试过任何事情,只是要求其他人为您完成工作。 (顺便说一句。这看起来像一个糟糕的数据库设计,这就是为什么查询比它应该的更难编写的原因。) 确实尝试过但被卡住了(请参阅下面我对答案的评论)。谢谢你的建议;-) 【参考方案1】:

这可能是最有效的方式,虽然写起来有点麻烦:

select t2.*
from table2 t2 
where exists (select 1 from table1 t1 where t2.cat1 in (t1.cat1, t1.cat2, t1.cat3, t1.cat4, t1.cat5) or
      exists (select 1 from table1 t1 where t2.cat2 in (t1.cat1, t1.cat2, t1.cat3, t1.cat4, t1.cat5) or
      exists (select 1 from table1 t1 where t2.cat3 in (t1.cat1, t1.cat2, t1.cat3, t1.cat4, t1.cat5) or
      exists (select 1 from table1 t1 where t2.cat5 in (t1.cat1, t1.cat2, t1.cat3, t1.cat4, t1.cat5) or
      exists (select 1 from table1 t1 where t2.cat6 in (t1.cat1, t1.cat2, t1.cat3, t1.cat4, t1.cat5);

不过,更重要的是,您的数据结构很糟糕。在 SQL 中,尝试将多列用作数组通常是一个坏主意。您需要为其中的每一个创建一个联结表,其中每个 id 和类别都有一行。如果你有这样的数据结构,查询会更简单,而且性能可能会更好。

【讨论】:

谢谢@Gordon Linoff。我确实有与上述类似的东西。我希望有更经济的东西,由于你给出的原因,这可能是不可能的。我可以按照您的指示重组表 1。基本上,表 1 包含通过提要提供的类别和表 2 产品(对结构没有控制)。我通过重组来接受它,我可以使用“IN”吗? 你仍然需要多个ins,因为第二个表是非规范化的。 再次感谢。我重组了表格,它工作得很好,谢谢。【参考方案2】:
WITH Table1Ids AS (
    SELECT ID, cat
    FROM Table1
         CROSS APPLY (
             VALUES (cat0), (cat1), (cat2), (cat3), (cat4)
         ) AS CA1(cat)
)
,Table2Ids AS (
    SELECT ID, cat
    FROM Table2
         CROSS APPLY (
             VALUES (cat0), (cat1), (cat2), (cat3), (cat4)
         ) AS CA1(cat)
)
,MatchingRecords AS (
    SELECT DISTINCT Table1Ids.ID AS Table1ID
                   ,Table2Ids.ID AS Table2ID
    FROM Table1Ids
         INNER JOIN Table2Ids
             ON Table2Ids.cat = Table1Ids.cat
)
SELECT Table2.*
FROM MatchingRecords
     INNER JOIN Table2
         ON Table2.ID = MatchingRecords.Table2ID
WHERE MatchingRecords.Table1ID = @TheIDYouAreLookingFor

【讨论】:

嗨@adrianm 谢谢你的帮助..这不起作用..我需要将表1中记录的ID传递给它。我认为我最初的问题不清楚。请参阅我的问题的 cmets ;-) @DolphinDan,你不能只添加WHERE Table1Ids.ID = @TheIDYouAreLookingFor

以上是关于SQL Server:交叉引用一个表中的多个列与另一个表中的多个列的主要内容,如果未能解决你的问题,请参考以下文章

选择表中的列与另一个表中的列不同的数据

如果任何列与另一个表中的匹配行不同,如何插入行

如何将一个 DataFrame 中的多个列与另一个 DataFrame 连接

将一个表中的多个值与另一个表中的多个值进行比较

SQL - 从源表中提取某些记录,但也交叉引用该表

详解SQL Server连接(内连接外连接交叉连接)