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 ALL和JOIN.我应该选择哪种方法?
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)
问题是你在每个表中得到行的笛卡尔积,其中任一列都有你正在寻找的值.
我想你只想要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)