Sql server 在存储过程中左联接的正确方法
我有一些关于左撇子的问题 我有这些桌子: dbo.ARoom_型Sql server 在存储过程中左联接的正确方法,sql-server,stored-procedures,Sql Server,Stored Procedures,我有一些关于左撇子的问题 我有这些桌子: dbo.ARoom_型 id | roomtype_name | isactive ---+---------------+----------- 1 | Presidential | 1 2 | De Luxe | 1 弱势群体 id | amenities_name | isactive ---+----------------+---------- 1 | Internet | 1 2 |
id | roomtype_name | isactive
---+---------------+-----------
1 | Presidential | 1
2 | De Luxe | 1
弱势群体
id | amenities_name | isactive
---+----------------+----------
1 | Internet | 1
2 | Cable TV | 1
3 | Bath Tub | 1
4 | Air-con | 1
5 | Telephone | 1
dbo.A详细信息:
id | roomtype_id | amenities_id
---+-------------+--------------
1 | 1 | 1
2 | 1 | 2
3 | 1 | 4
4 | 2 | 1
我试过这个问题
SELECT
B.id as 'details_id',
C.roomtype_name,
A.amenities_name
FROM
AAmenities AS A
LEFT JOIN
AAmenities_details AS B ON B.amenities_id = A.id
LEFT JOIN
ARoom_type as C ON C.id = B.roomtype_id
@id INT
AS
BEGIN TRY
SELECT
B.id AS 'details_id',
C.roomtype_name,
A.amenities_name
FROM
AAmenities AS A
LEFT JOIN
AAmenities_details AS B ON B.amenities_id = A.id
LEFT JOIN
ARoom_type AS C ON C.id = B.roomtype_id
WHERE
C.id = @id
这就是我得到的
结果:
details_id | roomtype_name | amenities_name
-----------+----------------+----------------
1 | Presidential | Internet
2 | De Luxe | Internet
3 | Presidential | Cable TV
4 | NULL | Bath Tub
5 | Presidential | Air-con
6 | NULL | Telephone
我可以得到所有的便利设施和所有的房间类型名称,这是我想要的,但我希望这是由房间类型,所以如果总统只有总统,我尝试了这个问题
SELECT
B.id as 'details_id',
C.roomtype_name,
A.amenities_name
FROM
AAmenities AS A
LEFT JOIN
AAmenities_details AS B ON B.amenities_id = A.id
LEFT JOIN
ARoom_type as C ON C.id = B.roomtype_id
@id INT
AS
BEGIN TRY
SELECT
B.id AS 'details_id',
C.roomtype_name,
A.amenities_name
FROM
AAmenities AS A
LEFT JOIN
AAmenities_details AS B ON B.amenities_id = A.id
LEFT JOIN
ARoom_type AS C ON C.id = B.roomtype_id
WHERE
C.id = @id
我只能得到这些结果
id | roomtype_name | amenities_name
----+-----------------+----------------
1 | Presidential | Internet
2 | Presidential | Cable TV
4 | Presidential | Air-con
这就是结果,当我想要的是这样:
details_id | roomtype_name | amenities_name
-----------+----------------+-----------------
1 | Presidential | Internet
3 | Presidential | Cable TV
4 | NULL | Bath Tub
5 | Presidential | Air-con
6 | NULL | Telephone
当我想要id并且仍然获得所有便利设施的名称时,哪种查询是正确的?即使我的roomtype\u名称的值为空,如何左键连接答案?非常感谢您您需要
aameanities\u详细信息的所有数据
,然后再试一次
SELECT
B.id as 'details_id',
C.roomtype_name,
A.amenities_name
FROM
AAmenities_details as B
LEFT JOIN AAmenities as A
on B.amenities_id = A.id
LEFT JOIN ARoom_type as C
on C.id = B.roomtype_id
WHERE B.roomtype_id = @id
但我认为每个AAmenities\u详细信息
必须具有AAmenities
因此您可以在AAmenities\u details
和AAmenities
SELECT
B.id as 'details_id',
C.roomtype_name,
A.amenities_name
FROM
AAmenities_details as B
INNER JOIN AAmenities as A
on B.amenities_id = A.id
LEFT JOIN ARoom_type as C
on C.id = B.roomtype_id
WHERE B.roomtype_id = @id
您需要
aamenilities\u details
的所有数据,然后重试
SELECT
B.id as 'details_id',
C.roomtype_name,
A.amenities_name
FROM
AAmenities_details as B
LEFT JOIN AAmenities as A
on B.amenities_id = A.id
LEFT JOIN ARoom_type as C
on C.id = B.roomtype_id
WHERE B.roomtype_id = @id
但我认为每个AAmenities\u详细信息
必须具有AAmenities
因此您可以在AAmenities\u details
和AAmenities
SELECT
B.id as 'details_id',
C.roomtype_name,
A.amenities_name
FROM
AAmenities_details as B
INNER JOIN AAmenities as A
on B.amenities_id = A.id
LEFT JOIN ARoom_type as C
on C.id = B.roomtype_id
WHERE B.roomtype_id = @id
mysql还是sql server?正确标记您的rdbms。这是
mysql
还是sql server
?哦,对不起,是sql server mysql还是sql server?正确标记您的rdbms。这是mysql
还是sql server
?哦,很抱歉,它的sql server我只想看到所有设施的名称,即使roomtype名称为空,所以如果我输入id 1,结果将是:'details_id | roomtype | name |设施| name 1 | Presidential | Internet |3 |总统|有线电视4 |空|浴缸5 |总统|空调6 |空|电话|我编辑。你不应该使用c.id=@id
,因为它可能是空的。更改为B.roomtypeid=@id
不能相同。当detail\u id
=4时,其roomtype
=2,您的结果中不存在该名称。我只想看到所有设施的名称,即使roomtype名称为空,因此如果我输入id 1,结果将是:“详细信息”\u id | roomtype |名称|设施|名称1 |总统|互联网3 |总统|有线电视4 |空|浴缸5 |总统|空调6 |空|电话|我编辑。你不应该使用c.id=@id
,因为它可能是空的。更改为B.roomtypeid=@id
不能相同。当detail\u id
=4时,则其roomtype
=2,它不能存在于您的结果中。