T-SQL 从表 A 中选择全部并在表 B 上条件

发布于 2024-12-07 21:52:36 字数 1100 浏览 0 评论 0原文

TableA Columns: A_ID, NAME, SOURCE, TITLE, EVENTID
TableB Columns: B_ID, EVENTID, CODE, FIELD

如何提取 NAME、SOURCE、TITLE 和 FIELD 或 null(如果有 CODE=x)?例子应该能更好地说明这一点。它是 SQL Server Express 上的 T-SQL。

示例

TableA                                 |   TableB
-----------------------------------------------------------------------
A_ID, NAME, SOURCE, TITLE, EVENTID     |   B_ID, EVENTID, CODE, FIELD
-----------------------------------------------------------------------
1     john  s1      x      100         |   1     100      5     textA  
2     bruce s2      y      105         |   2     100      10    textB
3     bob   s3      z      110         |   3     105      5     textC
                                       |   4     110      5     textD
                                       |   5     110      10    textE

EventId 105 没有代码 10,因此结果应为 null。如何编写一个 SELECT 查询来给我这样的结果:

[ john  | s1 | x | textB ]
[ bruce | s2 | y |       ]
[ bob   | s3 | z | textE ]

这可能真的很容易,但我无法弄清楚..提前致谢。

TableA Columns: A_ID, NAME, SOURCE, TITLE, EVENTID
TableB Columns: B_ID, EVENTID, CODE, FIELD

How do I extract NAME, SOURCE, TITLE and FIELD or null (if there is CODE=x) ? Example should show it better. It's T-SQL on SQL Server Express.

Example:

TableA                                 |   TableB
-----------------------------------------------------------------------
A_ID, NAME, SOURCE, TITLE, EVENTID     |   B_ID, EVENTID, CODE, FIELD
-----------------------------------------------------------------------
1     john  s1      x      100         |   1     100      5     textA  
2     bruce s2      y      105         |   2     100      10    textB
3     bob   s3      z      110         |   3     105      5     textC
                                       |   4     110      5     textD
                                       |   5     110      10    textE

There is no code 10 for EventId 105 so the result should be null. How do write a SELECT quesry that would give me such result:

[ john  | s1 | x | textB ]
[ bruce | s2 | y |       ]
[ bob   | s3 | z | textE ]

It might be really easy but I can't figure it out.. Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

山色无中 2024-12-14 21:52:36

您需要在表之间使用 OUTER JOIN

SELECT A.NAME,
       A.SOURCE,
       A.TITLE,
       B.FIELD
FROM   TableA A
       LEFT JOIN TableB B
         ON A.EVENTID = B.EVENTID
            AND B.CODE = 10  

B.CODE = 10 条件需要进入 JOIN 而不是 WHERE 子句,以避免有效地将查询转回 INNER JOIN

如果有多个连接记录,这可能会为特定的 A 值返回多行,但从您的问题中不清楚这在您的数据中是否可能(如果是的话,哪个 B .Field 值应该被使用),这很可能是您想要的行为。

You need an OUTER JOIN between the tables

SELECT A.NAME,
       A.SOURCE,
       A.TITLE,
       B.FIELD
FROM   TableA A
       LEFT JOIN TableB B
         ON A.EVENTID = B.EVENTID
            AND B.CODE = 10  

The B.CODE = 10 condition needs to go in the JOIN not a WHERE clause to avoid effectively turning the query back into an INNER JOIN.

This can return multiple rows for a particular A value if there is more than one joining record but it is not clear from your question if this is possible in your data anyway (and if so which B.Field value should be used) and this may well be your desired behaviour.

仅此而已 2024-12-14 21:52:36

这应该可以做到

SELECT a.NAME, a.SOURCE, a.TITLE, b.FIELD 
  FROM TableA a
       LEFT JOIN TableB b ON b.EventId = a.EventId
             AND b.Code = 10

This should do it

SELECT a.NAME, a.SOURCE, a.TITLE, b.FIELD 
  FROM TableA a
       LEFT JOIN TableB b ON b.EventId = a.EventId
             AND b.Code = 10
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文