来自多个表的UNION或JOIN for SELECT

Ben*_*rey 4 sql sql-server union join

我的问题

我试图根据参数从多个表中选择一行,但我对SQL加入的有限知识阻碍了我.有人可能会指出我正确的方向吗?

考虑这些表结构:

+-----------------------+     +---------------------+
| Customers             |     | Sellers             |
+-------------+---------+     +-----------+---------+
| Customer_ID | Warning |     | Seller_ID | Warning |
+-------------+---------+     +-----------+---------+
| 00001       | Test 1  |     | 00008     | Testing |
| 00002       | Test 2  |     | 00010     | Testing |
+-------------+---------+     +-----------+---------+
Run Code Online (Sandbox Code Playgroud)

我想要做的是SELECT只检索一行,并且在此行中将是基于X_ID字段的每个表的"警告"字段.

期望的结果

所以,如果我提交了以下信息,我会收到以下结果:

例1:

Customer_ID = 00001
Seller_ID = 00008

Results:
+-----------------------------------+
| Customer_Warning | Seller_Warning |
+------------------+----------------+
| Test 1           | Testing        |
+------------------+----------------+
Run Code Online (Sandbox Code Playgroud)

例2:

Customer_ID = 00001
Seller_ID = 00200

Results:
+-----------------------------------+
| Customer_Warning | Seller_Warning |
+------------------+----------------+
| Test 1           | NULL           |
+------------------+----------------+
Run Code Online (Sandbox Code Playgroud)

我曾经尝试过什么

这是我当前的代码(我收到了大量的行):

SELECT c.Warning 'Customer_Warning', s.Warning AS 'Seller_Warning'
FROM Customers c,Sellers s
WHERE c.Customer_ID = @Customer_ID
    OR s.Seller_ID = @Seller_ID
Run Code Online (Sandbox Code Playgroud)

但我也玩过UNION,UNION ALLJOIN.我应该选择哪种方法?

Dav*_*idG 11

由于您并未真正将表连接在一起,只需从每个表中选择一行,您可以这样做:

SELECT 
    (SELECT Warning 
     FROM Customers 
     WHERE Customer_ID = @Customer_ID) AS Customer_Warning,
    (SELECT Warning 
     FROM Sellers 
     WHERE Seller_ID = @Seller_ID) AS Seller_Warning
Run Code Online (Sandbox Code Playgroud)

  • 这是针对所提出的情况的正确解决方案,因为在一个条目与另一个条目之间不存在关联,所以这里不适用连接.具体应该用于根据公共因子合并两个表. (2认同)

D S*_*ley 5

问题是你在每个表中得到行的笛卡尔积,其中任一列都有你正在寻找的值.

我想你只想要AND而不是OR:

SELECT c.Warning 'Customer_Warning', s.Warning AS 'Seller_Warning'
FROM Customers c 
JOIN Sellers s
ON c.Customer_ID = @Customer_ID
    AND s.Seller_ID = @Seller_ID
Run Code Online (Sandbox Code Playgroud)

如果性能不够好,您可以加入两个过滤的子查询:

SELECT c.Warning 'Customer_Warning', s.Warning AS 'Seller_Warning'
FROM (SELECT Warnning FROM Customers WHERE c.Customer_ID = @Customer_ID) c,
     (SELECT Warning FROM Sellers s WHERE s.Seller_ID = @Seller_ID) s
Run Code Online (Sandbox Code Playgroud)

但我怀疑SQL能够优化过滤连接.

如果其中一个ID不存在,它就不会返回一行.

然后你想要一个FULL OUTER JOIN:

SELECT c.Warning 'Customer_Warning', s.Warning AS 'Seller_Warning'
FROM Customers c 
FULL OUTER JOIN Sellers s
ON c.Customer_ID = @Customer_ID
    AND s.Seller_ID = @Seller_ID
Run Code Online (Sandbox Code Playgroud)